Сборка C-> библиотеки Python на 64-битной ОС - PullRequest
1 голос
/ 14 февраля 2012

У меня есть сторонняя библиотека, которую я обернул Swig, чтобы я мог общаться с ней на Python. Это работает для 32-битных OS / Python / сторонних библиотек. Недавно я получил 64-битные версии этих библиотек от третьих лиц, поэтому я хочу перестроить библиотеки, чтобы воспользоваться этим преимуществом (конечно, с использованием 64-битного Python и 64-битной ОС). Тем не менее, я получаю эту ошибку при попытке импортировать библиотеки:

Traceback (most recent call last):
  File "camera.py", line 1, in <module>
    import memhandler
  File "C:\neo\memhandler.py", line 26, in <module>
    _memhandler = swig_import_helper()
  File "C:\neo\memhandler.py", line 22, in swig_import_helper
    _mod = imp.load_module('_memhandler', fp, pathname, description)
ImportError: DLL load failed: %1 is not a valid Win32 application.

(memhandler - одна из библиотек SWIG, которую я создаю) Мои поиски обнаружили других людей, у которых была эта ошибка из-за 32-битных / 64-битных несоответствий, так что, похоже, это указывает на какое-то несоответствие архитектуры, но у меня возникают проблемы с определением, где происходит ошибка.

Я использую командную строку Visual Studio 2008 для связи с Python 2.7 64-bit; здесь нет несоответствия версий (другими словами, 64-битная версия Python 2.7 была собрана с помощью того же компилятора). Я сделал это успешно в прошлом с другой программой; к сожалению, я не могу сказать, сравнивая это с этим, что отличается в этом. Я использую 64-битный компилятор (запустив vcvarsall.bat amd64 перед запуском).

Вот мой Makefile:

PYROOT = C:\Python27x64
PYINCLUDE = /I$(PYROOT)\include /I$(PYROOT)\Lib\site-packages\numpy\core\include
PYLIBS = /LIBPATH:$(PYROOT)\libs python27.lib
ANDORLIBS = "Andor SDK3\atcorem.lib"
LIBS = $(PYLIBS) $(ANDORLIBS)

CXXFLAGS = /MD /EHsc /DWIN32 /D_WINDOWS /DNOPCH /O2 $(PYINCLUDE)

# We have two separate SWIG libraries to build here; one calls most of the
# Andor functions; the other does some intermediary work for us before
# calling certain special Andor functions. We also have to compile the
# intermediary library ourselves.
ANDOROBJS = neo_wrap.obj
WRAPOBJS = memhandler.obj
WRAPSWIGOBJS = memhandler_wrap.obj

ANDORTARGET = _neo.pyd
WRAPTARGET = _memhandler.pyd

all: $(ANDORTARGET) $(WRAPTARGET)

$(ANDORTARGET): $(ANDOROBJS)
    link /dll /DEBUG /NOLOGO /out:$@ /SUBSYSTEM:WINDOWS $(ANDOROBJS) $(LIBS)

$(WRAPTARGET): $(WRAPOBJS) $(WRAPSWIGOBJS)
    link /dll /DEBUG /NOLOGO /out:$@ /SUBSYSTEM:WINDOWS $(WRAPOBJS) $(LIBS)
    link /dll /DEBUG /NOLOGO /out:$@ /SUBSYSTEM:WINDOWS $(WRAPSWIGOBJS) $(LIBS) memhandler.obj

swig:
    C:\swigwin-2.0.4\swig.exe -c++ -python neo.i
    C:\swigwin-2.0.4\swig.exe -c++ -python memhandler.i

clean:
    del *ilk *lib *pdb *obj *exp *wrap.cxx *pyd *pyd.manifest

Есть идеи? Единственное, о чем я могу думать, это то, что у меня нет 64-битных библиотек; Я не знаю, как определить, является ли файл DLL / LIB 64-битным или 32-битным.

...