2009-08-05 7 views
21

Python a une directive pragma plutôt bête dans ses fichiers include qui force un lien contre python26_d.lib lorsque la variable du préprocesseur DEBUG est définie. C'est un problème car le programme d'installation python ne vient pas avec python26_d.lib! Donc, je ne peux pas construire d'applications dans msvc en mode debug. Si je temporairement #undef DEBUG pour un seul fichier, je reçois beaucoup de plaintes au sujet de la liaison DLL incohérent. Si je change le pragma dans le fichier pythons, j'obtiens des références non définies à diverses fonctions de débogage.Compilation de modules python avec DEBUG défini sur MSVC

J'ai essayé de compiler ma propre version de python, mais son en quelque sorte assez différent du python qui est distribué que je ne peux pas utiliser mes modules avec des applications construites avec la version vanille de python

Quelqu'un peut-il me donner des des conseils sur la façon de contourner cela?

Merci

+0

Pouvez-vous créer un fichier .lib débogage du .dll via [dumpbin http://support.microsoft.com/kb/131313] (http://support.microsoft.com/kb/131313)? –

Répondre

20

De python list

Pour contourner ce problème à la situation, essayez de copier le fichier python26.dll à python26_d.dll. (Je ne suis pas sûr que ce fonctionnera, vous dites que vous construisez une bibliothèque SWIG en mode débogage, et il est possible que SWIG essaie d'utiliser les fonctionnalités de la version de débogage Python. ll ont pas d'autre choix que d'utiliser la

version de débogage de Python)

Edit:. d'après les commentaires:

Vous devez également modifier pyconfig.h et commentaire sur la ligne « #define Py_DEB UG "(ligne 374)

+0

Merci, mais cela ne fonctionne pas. J'obtiens également les externes non résolus si je fais cela. – DaedalusFall

+5

AHA!Mais cela fonctionne si vous éditez aussi pyconfig.h et commentez la ligne "#define Py_DEBUG" (ligne 374). Ensuite tout va bien. C'est toujours agaçant que vous ayez à modifier l'installation plutôt que votre propre code, mais cela fonctionne. J'ai choisi votre réponse comme la réponse choisie, mais ce serait bien si vous mettez à jour votre réponse avec cette astuce, au cas où d'autres personnes viendraient à la recherche car ils ne s'attendent pas à ce qu'une partie de la solution soit dans un commentaire. Merci! – DaedalusFall

+1

@DaedalusFall: Mettez cette instruction dans une réponse, je veux l'upvote! Avait exactement le même problème et votre solution semble bien fonctionner. – Mizipzor

2

Cela fonctionne également lors de la liaison avec des bibliothèques statiques. J'ai fait une copie de python26.lib, et l'ai renommé python26_d.lib. J'ai commenté la ligne #define PY_DEBUG dans pyconfig.h. Aussi changé le pragma à "pragma comment (lib," python26.lib ")" sur la ligne 332. Voila! Ça a marché.

4

Vous pouvez également aller dans l'autre sens: passer à «Release», puis le déboguer. vous devez activer la génération des informations sur les symboles de débogage dans les propriétés du projet dans les préférences du compilateur et de l'éditeur de liens; MSDN here vous dira exactement quelles options vous devez définir pour déboguer une version de version.

7

Une fois que vous mettez en commentaire "#define Py_DEBUG" sur la ligne 332 et de modifier

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

à

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

vous ne avez pas besoin de python26_d.lib plus.

4

Sur la base de toutes les réponses que je réussi handicapés _DEBUG temporaire:

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