Ответ 1
Мои установки Cygwin и MinGW gcc противоречили друг другу. Я удалил их обоих и установленные MinGW и cygwin без gcc, и это решило проблему.
Я пытаюсь сделать отладочную сборку библиотеки 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'
Мои установки Cygwin и MinGW gcc противоречили друг другу. Я удалил их обоих и установленные MinGW и cygwin без gcc, и это решило проблему.
Если кто-то встречает это же сообщение об ошибке, но в другой ситуации: попробуйте добавить -D MS_WIN64
в свою командную строку, это сработало для меня!
В файле 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'
Я видел это, если вы пытаетесь смешать объектный код, скомпилированный для отладки (определяется _DEBUG
макрос) с объектами без отладки (_DEBUG
не определен).
В коде ядра python есть строка, в которой #defines Py_InitModule4
используется другое имя (Py_InitModule4TraceRefs
), чтобы вызвать ошибку "link-time error" (! sic), если вы смешиваете объекты.
Удостоверьтесь, что вы связываетесь с библиотекой отладки python при компиляции для отладки и наоборот.
Я просто решил эту проблему, добавив флаг компилятора -DPy_TRACE_DEFS
. В моем случае я пытался создать отладочные версии SIP/PyQt.
Ошибка может возникнуть, если отладочная версия Python скомпилирована с включенной опцией Py_TRACE_DEFS
. Это приводит к тому, что результирующая библиотека python2x_d содержит функцию Py_InitModule4TraceRefs
вместо Py_InitModule4
, которую ищет компилятор (среди других изменений). При включении опции для проекта, который вы строите, обеспечивается совместимость кода и правильная версия Py_InitModule4
.
Более подробную информацию о Py_TRACE_DEFS
можно найти в Misc/SpecialBuilds.txt
в исходной папке Python или здесь.