簡體   English   中英

Python:對__imp __Py_InitModule4的未定義引用

[英]Python: undefined reference to `_imp __Py_InitModule4'

我正在嘗試使用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\
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'

如果有人遇到同樣的錯誤消息,但在不同的情況下:嘗試將-D MS_WIN64添加到命令行,它對我-D MS_WIN64

在包含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'

我剛剛通過添加編譯器標志-DPy_TRACE_DEFS解決了這個問題。 在我的情況下,我試圖構建SIP / PyQt的調試版本。

在打開Py_TRACE_DEFS選項的情況下編譯Python的調試版本時,可能會發生此錯誤。 這導致生成的python2x_d庫包含函數Py_InitModule4TraceRefs而不是編譯器正在尋找的Py_InitModule4 (以及其他更改)。 為正在構建的項目切換選項可確保生成的代碼兼容,並找到正確版本的Py_InitModule4

有關Py_TRACE_DEFS更多信息可以在Python源文件夾或此處的 Misc/SpecialBuilds.txt找到

如果您嘗試將為調試編譯的目標代碼(已定義_DEBUG宏)與非調試對象(未定義_DEBUG )混合使用,我已經看到了這一點。

如果混合對象,python核心代碼中有一行#defines Py_InitModule4到另一個名稱( Py_InitModule4TraceRefs )以觸發“鏈接時錯誤”(!sic)。

編譯調試時確保鏈接到python調試庫,反之亦然。

我的Cygwin和MinGW gcc安裝相互沖突。 我刪除它們和安裝的MinGW和cygwin沒有gcc,這解決了問題。

對於那些沒有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 <Python.h>之前,它解決了您可能遇到的“未定義的hypot”問題,正如相關SO帖子所建議的那樣。 在這兩次調整之后,你最有可能在沒有痛苦的情況下編譯make -j4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM