编译在MSVC上定义的DEBUG的python模块

时间:2009-08-05 22:16:29

标签: python debugging visual-c++

Python相当愚蠢地在其包含文件中有一个pragma指令,当定义python26_d.lib预处理程序变量时强制指向DEBUG的链接。这是一个问题,因为python安装程序没有python26_d.lib!所以我无法在调试模式下在msvc中构建应用程序。如果我暂时#undef DEBUG只有一个文件,我会收到很多关于DLL链接不一致的抱怨。如果我更改pythons包含文件中的pragma,我会获得对各种调试函数的未定义引用。

我已经尝试编译我自己的python版本,但它与python的分布不同,我不能使用我的模块与使用python的vanilla版本构建的应用程序

任何人都可以就如何解决这个问题给我任何建议吗?

由于

5 个答案:

答案 0 :(得分:21)

来自python list

  

作为解决问题的方法,请尝试   将文件python26.dll复制到   python26_d.dll。 (我不确定这个   将工作;你说你正在建造一个   SWIG库在调试模式下,它是   可能是SWIG会尝试使用   Python调试的功能   版。如果是这样的话,你会的   别无选择,只能使用   调试Python版本。)

编辑:来自评论:

  

您还应该编辑pyconfig.h和   注释掉“#define   Py_DEBUG“(第374行)

答案 1 :(得分:7)

在第332行注释掉“#define Py_DEBUG”并修改

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

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

你不再需要python26_d.lib了。

答案 2 :(得分:4)

您也可以采用其他方式:切换到«Release»然后进行调试。您需要在编译器和链接器首选项中的项目属性中启用生成调试符号信息; MSDN here将准确告诉您为调试发布版本需要设置哪些选项。

答案 3 :(得分:4)

基于我成功禁用的所有答案_DEBUG临时:

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

答案 4 :(得分:2)

这在与静态库链接时也适用。我制作了python26.lib的副本,并将其重命名为python26_d.lib。我在pyconfig.h中注释了#define PY_DEBUG行。也在第332行将pragma改为“pragma comment(lib,”python26.lib“)”。瞧!它奏效了。