2010-05-16 15 views
10

Sto provando a eseguire una build di debug della libreria Rabbyt utilizzando gcc di mingw per eseguire con il mio python26_d creato con MSVC. Ho ottenuto molti riferimenti indefiniti che mi hanno fatto creare libpython26_d . a, tuttavia rimane uno dei riferimenti indefiniti. Googling mi dà:Python: riferimento non definito a `_imp __Py_InitModule4 '

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

Ma -rdynamic non aiuta.

 
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 è la riga di comando – Mark

+0

Non è consigliabile utilizzare MinGW (o uno qualsiasi dei suoi fork) con le build di Python di WIndows ufficiali (o qualsiasi altra build di MSVC), per i motivi illustrati a https://bugs.python.org/issue4709#msg243605. – mhsmith

risposta

2

Le mie installazioni gcc Cygwin e MinGW erano in conflitto tra loro. Ho cancellato entrambi e il MinGW installato e cygwin senza gcc e questo ha risolto il problema.

3

Ho visto questo se si prova a mescolare il codice oggetto compilato per il debug (la macro _DEBUG è definita) con gli oggetti non di debug (_DEBUG non è definito).

C'è una riga nel codice core python che #defines Py_InitModule4 in un altro nome (Py_InitModule4TraceRefs) per attivare un "errore di collegamento" (! Sic) se si mescolano oggetti.

Assicurarsi di eseguire il collegamento a una libreria di debug di Python durante la compilazione per il debug e viceversa.

20

Se qualcuno incontra lo stesso messaggio di errore, ma in una situazione diversa: prova ad aggiungere -D MS_WIN64 alla riga di comando, ha funzionato per me!

+0

Anche questa era la mia correzione. Grazie! –

+0

@tiho Ciao, ho un problema simile su http://stackoverflow.com/questions/18956136/how-to-use-boost-python-vc110-mt-gd-1-54-lib-in-c Puoi aiutami con questo? Nel mio caso, non sto usando Boost per costruire i binari con la riga di comando. Sto semplicemente cercando di costruire un esempio Hello World. Dovrebbe essere molto facile, ma ora mi ha fatto impazzire ... Grazie. – ChangeMyName

14

Nel file C:\Python27\Lib\distutils\cygwinccompiler.py, che contiene le impostazioni del compilatore MinGW, trovare la classe 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)) 

e aggiungere -D MS_WIN64 al compiler_so argomento:

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

Wow grazie un mucchio! – huseyint

+2

Non è necessario fare confusione con il modulo distutils installato. Basta aggiungere 'define_macros = [('MS_WIN64', None)]' come argomento alla chiamata di setup in setup.py. – nmgeek

3

Ho appena risolto questo problema con l'aggiunta di la bandiera del compilatore -DPy_TRACE_DEFS. Nel mio caso stavo cercando di creare versioni di debug di SIP/PyQt.

L'errore può verificarsi quando la versione di debug di Python viene compilata con l'opzione Py_TRACE_DEFS attivata. Questo fa sì che la libreria python2x_d risultante contenga la funzione Py_InitModule4TraceRefs anziché Py_InitModule4 che il compilatore sta cercando (tra le altre modifiche). Se si attiva l'opzione per il progetto che si sta creando, il codice prodotto è compatibile e viene trovata la versione corretta di Py_InitModule4.

Ulteriori informazioni su Py_TRACE_DEFS sono disponibili in Misc/SpecialBuilds.txt nella cartella di origine Python o here.

Problemi correlati