Python: undefined ссылка на `_imp __Py_InitModule4 '

Я пытаюсь сделать отладочную сборку библиотеки Rabbyt, используя mingw gcc для запуска с моим MSVC-встроенным python26_d. У меня появилось много ссылок undefined, которые заставили меня создать libpython26_d.a, однако один из undefined ссылки остаются. Googling дает мне:

http://www.techlists.org/archives/programming/pythonlist/2003-03/msg01035.shtml

Но -rdynamic не помогает.

e:\MinGW/bin\gcc.exe -mno-cygwin -mdll -O -Wall -g -IE:\code\python\python\py26\
include -IE:\code\python\python\py26\PC -c rabbyt/rabbyt._rabbyt.c -o build\temp
.win32-2.6-pydebug\Debug\rabbyt\rabbyt._rabbyt.o -O3 -fno-strict-aliasing
rabbyt/rabbyt._rabbyt.c:1351: warning: '__Pyx_SetItemInt' defined but not used
writing build\temp.win32-2.6-pydebug\Debug\rabbyt\_rabbyt_d.def

e:\MinGW/bin\gcc.exe -mno-cygwin -shared -g build\temp.win32-2.6-pydebug\Debug\r
abbyt\rabbyt._rabbyt.o build\temp.win32-2.6-pydebug\Debug\rabbyt\_rabbyt_d.def -
LE:\code\python\python\py26\libs -LE:\code\python\python\py26\PCbuild -lopengl32
 -lglu32 -lpython26_d -lmsvcr90 -o build\lib.win32-2.6-pydebug\rabbyt\_rabbyt_d.
pyd
build\temp.win32-2.6-pydebug\Debug\rabbyt\rabbyt._rabbyt.o: In function `init_ra
bbyt':

E:/code/python/rabbyt/rabbyt/rabbyt._rabbyt.c:1121: undefined reference to `_imp
__Py_InitModule4'

Ответ 1

Мои установки Cygwin и MinGW gcc противоречили друг другу. Я удалил их обоих и установленные MinGW и cygwin без gcc, и это решило проблему.

Ответ 2

Если кто-то встречает это же сообщение об ошибке, но в другой ситуации: попробуйте добавить -D MS_WIN64 в свою командную строку, это сработало для меня!

Ответ 3

В файле C:\Python27\Lib\distutils\cygwinccompiler.py, который содержит настройки компилятора MinGW, найдите класс Mingw32CCompiler:

self.set_executables(compiler='gcc -O -Wall',
    compiler_so='gcc -mdll -O -Wall',
    compiler_cxx='g++ -O -Wall',
    linker_exe='gcc ',
    linker_so='%s %s %s'
        % (self.linker_dll, shared_option,
        entry_point))

и добавьте -D MS_WIN64 к аргументу compiler_so:

compiler_so='gcc -mdll -O -Wall -D MS_WIN64'

Ответ 4

Я видел это, если вы пытаетесь смешать объектный код, скомпилированный для отладки (определяется _DEBUG макрос) с объектами без отладки (_DEBUG не определен).

В коде ядра python есть строка, в которой #defines Py_InitModule4 используется другое имя (Py_InitModule4TraceRefs), чтобы вызвать ошибку "link-time error" (! sic), если вы смешиваете объекты.

Удостоверьтесь, что вы связываетесь с библиотекой отладки python при компиляции для отладки и наоборот.

Ответ 5

Я просто решил эту проблему, добавив флаг компилятора -DPy_TRACE_DEFS. В моем случае я пытался создать отладочные версии SIP/PyQt.

Ошибка может возникнуть, если отладочная версия Python скомпилирована с включенной опцией Py_TRACE_DEFS. Это приводит к тому, что результирующая библиотека python2x_d содержит функцию Py_InitModule4TraceRefs вместо Py_InitModule4, которую ищет компилятор (среди других изменений). При включении опции для проекта, который вы строите, обеспечивается совместимость кода и правильная версия Py_InitModule4.

Более подробную информацию о Py_TRACE_DEFS можно найти в Misc/SpecialBuilds.txt в исходной папке Python или здесь.