Python: неопределенная ссылка на `_imp __Py_InitModule4 ' - PullRequest
12 голосов
/ 16 мая 2010

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

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

Но -родинамика не помогает.

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'

Ответы [ 6 ]

22 голосов
/ 12 марта 2012

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

18 голосов
/ 08 ноября 2013

В файле 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'
3 голосов
/ 03 сентября 2015

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

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

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

3 голосов
/ 29 ноября 2010

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

В коде ядра Python есть строка, которая #defines Py_InitModule4 соответствует другому имени (Py_InitModule4TraceRefs), чтобы вызвать «ошибку времени соединения» (! Sic), если вы смешиваете объекты.

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

2 голосов
/ 13 августа 2010

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

0 голосов
/ 11 июня 2018

Для тех из вас, кто не имеет Visual Studio, но хотел бы скомпилировать OpenCV из исходного кода с помощью MinGW для Windows и столкнуться с этой проблемой, вот моя команда cmake:

cmake -G "MinGW Makefiles" -D CMAKE_BUILD_TYPE=RELEASE -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=OFF -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.1.0/modules -D PYTHON_EXECUTABLE=C:/Users/your_user_name/Envs/cv/Scripts/python.exe -D BUILD_EXAMPLES=ON -D CMAKE_CXX_FLAGS="-DMS_WIN64 -w" ..

(Для незнакомых: в «cmd.exe» создайте папку с именем build в папке opencv-3.1.0, в которой содержится файл с именем CMakeLists.txt, cd в build, и введите указанную выше команду. там. Вы можете редактировать большинство параметров по вашему желанию, я использовал виртуальную среду для Python, но вам не нужно.) Есть еще одна вещь, которую вам нужно сделать, это добавить

#include <cmath>
#define _hypot hypot

до #include <Python.h> в opencv-3.1.0\modules\python\src2\cv2.cpp, что решает проблему «неопределенной гипотезы», с которой вы можете столкнуться, как это предлагается в соответствующих сообщениях SO. Скорее всего, вы без проблем скомпилируете, например, make -j4 после этих двух настроек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...