【问题标题】:Python: undefined reference to `_imp __Py_InitModule4'Python:未定义引用`_imp __Py_InitModule4'
【发布时间】:2011-02-20 00:16:40
【问题描述】:

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

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\ 包括 -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:警告:“__Pyx_SetItemInt”已定义但未使用 编写 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:在函数`init_ra 拜托': E:/code/python/rabbyt/rabbyt/rabbyt._rabbyt.c:1121: 未定义引用`_imp __Py_InitModule4'

【问题讨论】:

  • python_d setup.py build --debug -c mingw32 是命令行
  • 不建议将 MinGW(或其任何分支)与官方 WIndows Python 构建(或任何其他 MSVC 构建)一起使用,原因在 bugs.python.org/issue4709#msg243605 中解释。

标签: python


【解决方案1】:

如果有人遇到同样的错误消息,但情况不同:尝试将 -D MS_WIN64 添加到您的命令行,它对我有用!

【讨论】:

  • 这也是我的修复。谢谢!
  • @tiho 嗨,我在stackoverflow.com/questions/18956136/… 遇到了类似的问题,你能帮我解决这个问题吗?就我而言,我没有使用 Boost 通过命令行构建二进制文件。我只是想构建一个 Hello World 示例。这应该很容易,但现在它让我发疯了......谢谢。
【解决方案2】:

在包含 MinGW 编译器设置的文件 C:\Python27\Lib\distutils\cygwinccompiler.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 添加到compiler_so 参数:

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

【讨论】:

  • 无需弄乱已安装的 distutils 模块。只需将 define_macros=[('MS_WIN64',None)] 作为参数添加到 setup.py 中的 setup 调用即可。
【解决方案3】:

我的 Cygwin 和 MinGW gcc 安装相互冲突。我删除了它们以及没有 gcc 的已安装的 MinGW 和 cygwin,这解决了问题。

【讨论】:

    【解决方案4】:

    如果您尝试混合为调试而编译的目标代码(定义了_DEBUG 宏)与非调试对象(未定义_DEBUG),我已经看到了这一点。

    python 核心代码中有一行 #defines Py_InitModule4 到另一个名称 (Py_InitModule4TraceRefs) 以在混合对象时触发“链接时错误”(!sic)。

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

    【讨论】:

      【解决方案5】:

      我刚刚通过添加编译器标志-DPy_TRACE_DEFS 解决了这个问题。就我而言,我试图构建 SIP/PyQt 的调试版本。

      在打开Py_TRACE_DEFS 选项的情况下编译 Python 的调试版本时可能会出现该错误。这会导致生成的 python2x_d 库包含函数 Py_InitModule4TraceRefs 而不是编译器正在寻找的 Py_InitModule4(以及其他更改)。为您正在构建的项目打开该选项可确保生成的代码兼容,并确保找到正确的 Py_InitModule4 版本。

      有关Py_TRACE_DEFS 的更多信息可以在Python 源文件夹中的Misc/SpecialBuilds.txthere 中找到。

      【讨论】:

        【解决方案6】:

        对于那些没有 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的文件,cdbuild中,并发出上述命令那里。您可以根据需要编辑大部分参数,我在这里使用了 Python 的虚拟环境,但您不必这样做。) 你还需要做一件事,那就是添加

        #include <cmath>
        #define _hypot hypot
        

        opencv-3.1.0\modules\python\src2\cv2.cpp 中的#include &lt;Python.h&gt; 之前,它解决了您可能遇到的“未定义的hypot”问题,正如相关SO 帖子所建议的那样。 您很可能会毫无痛苦地编译,例如make -j4 经过这两次调整。

        【讨论】:

          猜你喜欢
          • 2013-03-21
          • 1970-01-01
          • 1970-01-01
          • 2020-12-14
          • 1970-01-01
          • 1970-01-01
          • 2012-06-29
          • 2016-06-21
          • 2011-07-14
          相关资源
          最近更新 更多