2009-08-05 5 views
21

Python tiene una directiva pragma en sus archivos de inclusión que forza un enlace contra python26_d.lib cuando se define la variable del preprocesador DEBUG. ¡Esto es un problema porque el instalador de Python no viene con python26_d.lib! Entonces no puedo construir aplicaciones en msvc en modo de depuración. Si temporalmente #undef DEBUG para un solo archivo, recibo muchas quejas sobre enlaces DLL incoherentes. Si cambio el pragma en pitones, incluyo el archivo. Obtengo referencias no definidas a varias funciones de depuración.Compilando módulos de python con DEBUG definido en MSVC

He intentado compilar mi propia versión del pitón pero su alguna manera lo suficientemente diferente de la pitón que se distribuye de que no puedo usar mis módulos con aplicaciones integradas con la versión de vainilla del pitón

Puede alguien darme alguna consejos sobre cómo solucionar esto?

Gracias

+0

¿Se puede crear un archivo de depuración .lib del .dll a través de [dumpbin http://support.microsoft.com/kb/131313] (http://support.microsoft.com/kb/131313)? –

Respuesta

20

Desde python list

Como solución a la situación, intente para copiar el archivo a python26.dll python26_d.dll. (No estoy seguro de que este funcione; dices que estás construyendo una biblioteca SWIG en modo de depuración, y es posible que SWIG intente usar las características de la versión de depuración de Python . Si ese es el caso, estás ' ll no tienen más remedio que utilizar la versión depuración de Python)

Editar:. de los comentarios:

también debe editar pyconfig.h y comentar la línea "# define Py_DEB UG "(línea 374)

+0

Gracias, pero no funciona. También obtengo los elementos externos no resueltos si hago eso. – DaedalusFall

+5

AHA!Pero funciona si también edita pyconfig.hy comenta la línea "#define Py_DEBUG" (línea 374). Entonces todo está bien. Todavía es molesto que tengas que modificar la instalación en lugar de tu propio código, pero funciona. He seleccionado tu respuesta como la respuesta elegida, pero sería bueno que actualizaras tu respuesta con este consejo, en caso de que otras personas vengan, ya que no esperan que parte de la solución esté en un comentario. ¡Gracias! – DaedalusFall

+1

@DaedalusFall: Ponga esa instrucción en una respuesta, ¡quiero votarlo! Tenía exactamente el mismo problema y su solución parece funcionar bien. – Mizipzor

2

Esto también funciona cuando se vincula con bibliotecas estáticas. Hice una copia de python26.lib y le cambié el nombre python26_d.lib. Comenté la línea #define PY_DEBUG en pyconfig.h. También cambió el pragma a "pragma comment (lib," python26.lib ")" en la línea 332. ¡Voila! Funcionó.

4

También puede ir a la inversa: cambie a «Liberar» y luego depurarlo. debe habilitar la generación de la información de los símbolos de depuración en las propiedades del proyecto en las preferencias del compilador y enlazador; MSDN here le dirá exactamente qué opciones debe configurar para depurar una versión de lanzamiento.

7

Después de poner como comentarios "Py_DEBUG #define" en la línea 332 y modificar

# ifdef _DEBUG 
# pragma comment(lib,"python26_d.lib") 
# else 

a

# ifdef _DEBUG 
# pragma comment(lib,"python26.lib") 
# else 

que no es necesario python26_d.lib más.

4

Sobre la base de todas las respuestas que con éxito con discapacidad _DEBUG temporal:

#if _DEBUG 
    #define _DEBUG_IS_ENABLED 
    #undef _DEBUG 
#endif 
#include "pyconfig.h" 
#if defined(_DEBUG_IS_ENABLED) 
    #define _DEBUG 
#endif 
Cuestiones relacionadas