2010-05-16 27 views
10

我試圖做一個使用mingw的gcc與我的MSVC構建python26_d運行Rabbyt庫的調試版本。我有很多未定義的引用,這使我創建libpython26_d .a,但是其中一個未定義的引用仍然存在。谷歌搜索給我:Python:undefined引用到_imp __Py_InitModule4

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' 
+0

python_d setup.py build --debug -c mingw32是命令行 – Mark 2010-05-16 03:16:37

+0

出於上述原因,建議不要將MinGW(或其任何fork)與官方的WIndows Python版本(或任何其他MSVC版本)一起使用在https://bugs.python.org/issue4709#msg243605。 – mhsmith 2017-04-20 19:23:28

回答

2

我的Cygwin和MinGW gcc安裝是相互衝突的。我把它們都刪除了,並且安裝了MinGW和沒有gcc的cygwin,解決了這個問題。

3

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

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

確保在編譯進行調試時連接到python調試庫,反之亦然。

20

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

+0

這也是我的修復。謝謝! – 2012-10-19 12:23:12

+0

@tiho嗨,我有一個類似的問題在http://stackoverflow.com/questions/18956136/how-to-use-boost-python-vc110-mt-gd-1-54-lib-in-c你能幫助我呢?在我的情況下,我沒有使用Boost通過命令行構建二進制文件。我只是試圖構建一個Hello World示例。這應該很容易,但現在它讓我瘋狂......謝謝。 – ChangeMyName 2013-09-23 14:44:56

14

在文件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_WIN64compiler_so說法:

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

哇謝謝一堆! – huseyint 2013-11-29 23:29:53

+2

不需要混淆您安裝的distutils模塊。只需在setup.py中添加'define_macros = [('MS_WIN64',None)]'作爲設置調用的參數。 – nmgeek 2017-01-07 16:38:53

3

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

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

有關Py_TRACE_DEFS的更多信息,請參見Python源文件夾中的Misc/SpecialBuilds.txthere