Python:未定义的对`_imp `_Py_InitModule4';

Python:未定义的对`_imp `_Py_InitModule4';,python,Python,我正在尝试使用mingw的gcc对Rabbyt库进行调试构建,以与我的MSVC构建的python26_d一起运行。。我得到了很多未定义的引用,这导致我创建了libpython26_d.a,但是其中一个未定义的引用仍然存在。谷歌给了我: 但是,rdynamic没有帮助 e:\MinGW/bin\gcc.exe -mno-cygwin -mdll -O -Wall -g -IE:\code\python\python\py26\ include -IE:\code\python\python\py

我正在尝试使用mingw的gcc对Rabbyt库进行调试构建,以与我的MSVC构建的python26_d一起运行。。我得到了很多未定义的引用,这导致我创建了libpython26_d.a,但是其中一个未定义的引用仍然存在。谷歌给了我:

但是,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' e:\MinGW/bin\gcc.exe-mno cygwin-mdll-O-Wall-g-IE:\code\python\python\py26\ 包括-IE:\code\python\python\py26\PC-c rabbyt/rabbyt.\u rabbyt.c-o build\temp .win32-2.6-pydebug\Debug\rabbyt\rabbyt.\u rabbyt.o-O3-fno严格别名 rabbyt/rabbyt._rabbyt.c:1351:警告:“uu Pyx_SetItemInt”已定义但未使用 编写build\temp.win32-2.6-pydebug\Debug\rabbyt\\u rabbyt\u d.def e:\MinGW/bin\gcc.exe-mno cygwin-shared-g build\temp.win32-2.6-pydebug\r\n abbyt\rabbyt.\u rabbyt.o build\temp.win32-2.6-pydebug\Debug\rabbyt\\u rabbyt\u d.def- LE:\code\python\python\py26\libs-LE:\code\python\python\py26\PCbuild-lopengl32 -lglu32-lpython26\u d-lmsvcr90-o build\lib.win32-2.6-pydebug\rabbyt\u rabbyt\u d。 pyd build\temp.win32-2.6-pydebug\Debug\rabbyt\rabbyt.\u rabbyt.o:在函数'init\u ra'中 bbyt': E:/code/python/rabbyt/rabbyt/rabbyt.\u rabbyt.c:1121:未定义对`\u imp的引用 __Py_初始模块4'
我的Cygwin和MinGW gcc安装相互冲突。我删除了它们,并且在没有gcc的情况下删除了已安装的MinGW和cygwin,从而解决了问题。

如果您尝试将编译用于调试的目标代码(
\u DEBUG
宏已定义)与非调试对象(
\u DEBUG
未定义)混合使用,我会看到这一点

python核心代码中有一行代码将Py#InitModule4定义为另一个名称(
Py#InitModule4TraceRefs
),以在混合对象时触发“链接时间错误”(!sic)


在编译以进行调试时,请确保链接到python调试库,反之亦然。

如果有人遇到相同的错误消息,但情况不同:尝试将
-D MS_WIN64
添加到命令行,这对我来说很有效

在包含MinGW编译器设置的文件
C:\Python27\Lib\distutils\cygwingcompiler.py
中,找到
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
添加到
编译器\u so
参数:

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

我刚刚通过添加编译器标志
-DPy\u TRACE\u DEFS
解决了这个问题。在我的例子中,我试图构建SIP/PyQt的调试版本

在启用
Py\u TRACE\u DEFS
选项的情况下编译Python调试版本时,可能会发生此错误。这会导致生成的python2x_d库包含编译器正在查找的函数
Py_InitModule4TraceRefs
,而不是
Py_InitModule4
。为您正在构建的项目启用该选项可确保生成的代码兼容,并找到正确版本的
Py_InitModule4


关于
Py\u TRACE\u DEFS
的更多信息可以在Python源代码文件夹中的
Misc/SpecialBuilds.txt
中找到,或者。

对于那些没有Visual Studio但希望在Windows上使用MinGW从源代码编译OpenCV并遇到此问题的人,下面是我的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”中),在
opencv-3.1.0
文件夹中创建一个名为
build
的文件夹,其中包含一个名为
CMakeLists.txt的文件,
cd
build
,并在那里发出上述命令。您可以根据需要编辑大多数参数,我在这里使用了Python虚拟环境,但您不必这样做。) 您还需要做一件事,那就是添加

#include <cmath>
#define _hypot hypot
#包括
#定义_hypothypot
之前#将
包含在
opencv-3.1.0\modules\python\src2\cv2.cpp中
,它解决了相关SO帖子建议的可能遇到的“未定义的hypot”问题。
在这两次调整之后,您很可能会毫不费力地编译,例如使用
make-j4

python\u d setup.py build--debug-c mingw32是命令行不建议在正式的WIndows python构建(或任何其他MSVC构建)中使用MinGW(或其任何分支),原因请参见。这也是我的修复方法。谢谢@嗨,我现在也有类似的问题,你能帮我吗?在我的例子中,我没有使用Boost来使用命令行构建二进制文件。我只是想建立一个Hello World示例。这应该很容易,但现在它让我发疯了。。。谢谢。无需弄乱已安装的distutils模块。只需将
define_macros=[('MS_WIN64',None)]
作为参数添加到setup.py中的setup调用中。