2010-05-16 7 views
10

J'essaye de faire une version de débogage de la bibliothèque Rabbyt en utilisant gcc de mingw pour l'exécuter avec mon python26_d construit par MSVC .. J'ai eu beaucoup de références indéfinies qui m'ont amené à créer libpython26_d .a, mais l'une des références indéfinies reste. Googler me donne:Python: référence non définie à `_imp __Py_InitModule4 '

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

Mais -rdynamic ne vous aide pas.

 
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 build.py build --debug -c mingw32 est la ligne de commande – Mark

+0

Il n'est pas recommandé d'utiliser MinGW (ou l'une de ses branches) avec les versions officielles de WIndows Python (ou toute autre construction MSVC), pour les raisons expliquées à https://bugs.python.org/issue4709#msg243605. – mhsmith

Répondre

2

Mes installations Cygwin et MinGW gcc étaient en conflit les unes avec les autres. Je les ai supprimés tous les deux et le MinGW installé et le cygwin sans gcc et cela a résolu le problème.

3

Je l'ai vu si vous essayez de mélanger le code objet compilé pour le débogage (macro _DEBUG est défini) avec des objets non-debug (_DEBUG n'est pas défini).

Il existe une ligne dans le code python #defines Py_InitModule4 à un autre nom (Py_InitModule4TraceRefs) pour déclencher une "erreur de liaison" (! Sic) si vous mélangez des objets.

Assurez-vous que vous liez sur une bibliothèque de débogage Python lorsque vous compilez pour le débogage et vice-versa.

20

Si quelqu'un rencontre ce même message d'erreur, mais dans une situation différente: essayez d'ajouter -D MS_WIN64 à votre ligne de commande, cela a fonctionné pour moi!

+0

C'était aussi ma solution. Merci! –

+0

@tiho Salut, j'ai un problème similaire à http://stackoverflow.com/questions/18956136/how-to-use-boost-python-vc110-mt-gd-1-54-lib-in-c Pouvez-vous aide moi avec ça? Dans mon cas, je n'utilise pas Boost pour construire les binaires avec la ligne de commande. J'essaie simplement de construire un exemple Hello World. Ca devrait être très facile, mais maintenant ça me rend fou ... Merci. – ChangeMyName

14

Dans le fichier C:\Python27\Lib\distutils\cygwinccompiler.py, qui contient les paramètres du compilateur MinGW, trouver 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)) 

et ajouter -D MS_WIN64 à l'argument compiler_so:

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

Wow, merci beaucoup! – huseyint

+2

Inutile de jouer avec votre module distutils installé. Ajoutez simplement 'define_macros = [('MS_WIN64', None)]' en tant qu'argument à l'appel d'installation dans setup.py. – nmgeek

3

Je viens de résoudre ce problème en ajoutant le drapeau du compilateur -DPy_TRACE_DEFS. Dans mon cas, j'essayais de construire des versions de débogage de SIP/PyQt.

L'erreur peut se produire lorsque la version de débogage de Python est compilée avec l'option Py_TRACE_DEFS activée. Cela provoque la bibliothèque python2x_d qui en résulte contient la fonction Py_InitModule4TraceRefs au lieu de Py_InitModule4 que le compilateur recherche (parmi d'autres modifications). Activer l'option pour le projet que vous construisez garantit que le code produit est compatible et que la version correcte de Py_InitModule4 est trouvée.

Vous trouverez plus d'informations sur Py_TRACE_DEFS dans Misc/SpecialBuilds.txt dans le dossier source Python ou here.

Questions connexes