繁体   English   中英

使用 MSVC 上定义的 DEBUG 编译 python 模块

[英]Compiling python modules with DEBUG defined on MSVC

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

我试过编译我自己的 python 版本,但它与分发的 python 有很大不同,我不能将我的模块与使用 python 的香草版本构建的应用程序一起使用

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

来自python列表

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

编辑:来自评论:

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

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

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

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

你不再需要 python26_d.lib 了。

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

根据所有答案,我成功禁用了_DEBUG临时:

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

这在与静态库链接时也有效。 我复制了python26.lib,并将其重命名为python26_d.lib。 我在 pyconfig.h 中注释掉了 #define PY_DEBUG 行。 还在第 332 行将 pragma 更改为“pragma comment(lib,"python26.lib")”。瞧! 有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM