2010-05-16 8 views
10

Estoy tratando de hacer una compilación de depuración de la biblioteca Rabbyt usando gcc de mingw para ejecutar con mi MSVC construido python26_d .. Recibí muchas referencias indefinidas que me hicieron crear libpython26_d .a, sin embargo, una de las referencias indefinidas permanece. Google me da:Python: referencia indefinida a `_imp __Py_InitModule4 '

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

Pero -rdynamic no ayuda.

 
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 es la línea de comando – Mark

+0

No se recomienda usar MinGW (o cualquiera de sus horquillas) con las versiones oficiales de Windows Python (o cualquier otra construcción de MSVC), por las razones explicadas en https://bugs.python.org/issue4709#msg243605. – mhsmith

Respuesta

2

Mis instalaciones de Cygwin y MinGW gcc entraron en conflicto entre ellas. Los eliminé a ambos y instalé MinGW y cygwin sin gcc y eso resolvió el problema.

3

He visto esto si intenta mezclar el código de objeto compilado para la depuración (se define macro _DEBUG) con objetos sin depuración (_DEBUG no está definido).

Hay una línea en el código del núcleo de python que #defines Py_InitModule4 a otro nombre (Py_InitModule4TraceRefs) para desencadenar un "error de tiempo de enlace" (! Sic) si mezcla objetos.

Asegúrese de enlazar con una biblioteca de depuración python cuando compila para la depuración y viceversa.

20

Si alguien se encuentra con este mismo mensaje de error, pero en una situación diferente: intente agregar -D MS_WIN64 a su línea de comandos, ¡me funcionó!

+0

Esta fue mi solución también. ¡Gracias! –

+0

@tiho Hola, tengo un problema similar en http://stackoverflow.com/questions/18956136/how-to-use-boost-python-vc110-mt-gd-1-54-lib-in-c ¿Puedes ¿Ayúdame con esto? En mi caso, no estoy usando Boost para construir los binarios con la línea de comando. Simplemente intento crear un ejemplo de Hello World. Debería ser muy fácil, pero ahora me está volviendo loco ... Gracias. – ChangeMyName

14

En el archivo C:\Python27\Lib\distutils\cygwinccompiler.py, que contiene la configuración del compilador MinGW, encontrar la clase 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)) 

y añadir -D MS_WIN64 a la compiler_so argumento:

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

¡Wow, muchas gracias! – huseyint

+2

No hay necesidad de meterse con su módulo de distutils instalado. Simplemente agregue 'define_macros = [('MS_WIN64', Ninguno)]' como argumento a la llamada de configuración en setup.py. – nmgeek

3

acabo resuelto este problema mediante la adición la bandera del compilador -DPy_TRACE_DEFS. En mi caso, estaba intentando construir versiones de depuración de SIP/PyQt.

El error puede ocurrir cuando la versión de depuración de Python se compila con la opción Py_TRACE_DEFS activada. Esto hace que la biblioteca resultante python2x_d contenga la función Py_InitModule4TraceRefs en lugar de Py_InitModule4 que el compilador está buscando (entre otros cambios). Cambiar la opción para el proyecto que está construyendo garantiza que el código producido sea compatible y que se encuentre la versión correcta de Py_InitModule4.

Más información en Py_TRACE_DEFS se puede encontrar en Misc/SpecialBuilds.txt en la carpeta fuente de Python o here.