如何在构建cython模块时重写-DNDEBUG编译标志

时间:2014-06-18 01:22:16

标签: python c++ cython

我有一个Cython模块,通过cdef extern调用C ++函数。 C ++函数有assert()个语句,我想查看这些断言。但是,当我通过调用python setup.py build_ext --inplace创建模块时,始终使用-DNDEBUG调用gcc。无论何时运行代码,都不会检查断言。

我找不到使用-DNDEBUG覆盖setup.py的方法。这可能吗?

目前,我发现处理此问题的唯一方法是使用python setup.py使用的选项手动调用cython,gcc和g ++,但要取出-DNDEBUG。但必须有一个更简单的方法。

2 个答案:

答案 0 :(得分:10)

您可以在setup.py文件中取消定义NDEBUG。在定义扩展时只需使用undef_macros选项:

extensions = [ Extension ( "myprog", [ mysrc.c ], undef_macros = [ "NDEBUG" ] ) ]

在构建输出中,您将看到-DNDEBUG,后跟-UNDEBUG,它会覆盖它。有关扩展选项的详细信息,请参阅distutils documentation

但请注意,在扩展模块中触发的断言将导致python或ipython解释器退出。

答案 1 :(得分:1)

在包含NDEBUG之前,您可以手动取消定义<cassert>(如果已定义)。将以下行添加到包含这些断言语句的cpp文件的顶部。确保这些是该文件中的第一个语句。

#ifdef NDEBUG
# define NDEBUG_DISABLED
# undef NDEBUG
#endif
#include <cassert>

#ifdef NDEBUG_DISABLED
# define NDEBUG        // re-enable NDEBUG if it was originally enabled
#endif

// rest of the file

这将确保在处理器包含NDEBUG时未定义<cassert>,这将导致断言检查被编译到您的代码中。