2009-08-05 2 views
21

Python ha piuttosto stupidamente una direttiva pragma nei suoi file include che forza un collegamento con python26_d.lib quando viene definita la variabile del preprocessore DEBUG. Questo è un problema perché il programma di installazione di Python non viene fornito con python26_d.lib! Quindi non posso creare applicazioni in msvc in modalità di debug. Se ho temporaneamente #undef DEBUG per un solo file ottengo molti reclami sul collegamento DLL incoerente. Se cambio il pragma in python incluso il file ottengo riferimenti indefiniti a varie funzioni di debug.Compilare moduli python con DEBUG definiti su MSVC

ho cercato compilare la mia versione di Python, ma la sua in qualche modo abbastanza diverso dal python che viene distribuita che non posso usare i miei moduli con applicazioni integrate con la versione di vaniglia di pitone

Qualcuno mi può dare alcuna consigli su come aggirare questo?

Grazie

+0

Si può creare un debug lib file dal dll tramite [dumpbin http://support.microsoft.com/kb/131313] (http://support.microsoft.com/kb/131313)? –

risposta

20

Da python list

Come soluzione temporanea alla situazione, provare per copiare il file python26.dll a python26_d.dll. (Io non sono sicuro che questo funzionerà;. Dici che sta costruendo una biblioteca SWIG in modalità debug, ed è possibile che SWIG cercherà di usare caratteristiche del debug Python versione Se questo è il caso, è' ll hanno altra scelta che utilizzare la versione di debug di Python)

Edit:. Dai commenti:

Si dovrebbe anche modificare pyconfig.h e commentare la linea "#define Py_DEB UG "(riga 374)

+0

Grazie, ma non funziona. Ottengo anche gli aspetti esterni non risolti se lo faccio. – DaedalusFall

+5

AHA!Ma funziona anche se si modifica pyconfig.h e si commenta la riga "#define Py_DEBUG" (riga 374). Quindi tutto si collega bene. È ancora fastidioso dover modificare l'installazione piuttosto che il proprio codice, ma funziona. Ho selezionato la tua risposta come risposta scelta, ma sarebbe bello se avessi aggiornato la tua risposta con questo suggerimento, nel caso in cui altre persone si presentassero come se non si aspettassero che parte della soluzione fosse in un commento. Grazie! – DaedalusFall

+1

@DaedalusFall: Metti le istruzioni in una risposta, voglio svenderlo! Aveva lo stesso identico problema e la tua soluzione sembra funzionare bene. – Mizipzor

2

Questo funziona anche quando si collega alle librerie statiche. Ho creato una copia di python26.lib e l'ho rinominata python26_d.lib. Ho commentato la riga #define PY_DEBUG in pyconfig.h. Anche cambiato il pragma a "pragma comment (lib," python26.lib ")" sulla linea 332. Voila! Ha funzionato.

4

Si può anche andare nella direzione opposta: passare a «Rilascio» e quindi eseguire il debug. è necessario abilitare la generazione di informazioni sui simboli di debug nelle proprietà del progetto nei pref di compilatore e linker; MSDN here ti dirà esattamente quali opzioni devi impostare per eseguire il debug di una build di rilascio.

7

Dopo di commentare "#define Py_DEBUG" on line 332 e modificare

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

a

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

non è necessario per python26_d.lib più.

4

Sulla base di tutte le risposte che ho con successo disabili _DEBUG temporanea:

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