2009-08-05 48 views
21

Python在其包含文件中有一个pragma指令,当定义DEBUG预处理器变量时强制链接到python26_d.lib。这是一个问题,因为python安装程序不会附带python26_d.lib!所以我不能在调试模式下在msvc中构建应用程序。如果我暂时只为一个文件#undef DEBUG,我会收到很多关于不一致的DLL链接的抱怨。如果我在pythons包含文件中更改编译指示,我会得到对各种调试功能的未定义引用。编译python模块whith在MSVC上定义的DEBUG

我试图编译我自己的Python版本,但其不知何故从被分配,我不能用我的模块与蟒蛇的香草版本,内置的应用程序蟒蛇足够不同

谁能给我任何如何解决这个问题的建议?

感谢

+0

你可以创建一个调试通过从该.dll文件.LIB [DUMPBIN http://support.microsoft.com/kb/131313]( http://support.microsoft.com/kb/131313)? – 2009-08-05 23:00:20

回答

20

python list

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

编辑:从评论:

你也应该编辑pyconfig.h和 注释掉行“的#define Py_DEB UG“(行374)

+0

谢谢,但它不起作用。如果我这样做,我也会得到未解决的外部问题。 – DaedalusFall 2009-08-05 22:45:36

+5

AHA!但是,如果你还编辑pyconfig.h并注释掉“#define Py_DEBUG”行(第374行),它也可以工作。然后一切都很好。它仍然烦人,你必须修改安装而不是你自己的代码,但它的工作原理。我已经选择了答案作为选择的答案,但如果您使用此提示更新了答案,以防其他人来看,因为他们不会期望部分解决方案发表评论,所以这很好。谢谢! – DaedalusFall 2009-08-13 11:38:54

+1

@DaedalusFall:把这个指令放在一个答案中,我想上传它!有完全相同的问题和你的解决方案似乎工作正常。 – Mizipzor 2009-11-22 10:52:55

2

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

4

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

7

你对此有何评论后出 “的#define Py_DEBUG” 上线332和修改

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

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

你不需要再python26_d.lib。

4

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

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