我有一个Cython模块,通过cdef extern
调用C ++函数。 C ++函数有assert()
个语句,我想查看这些断言。但是,当我通过调用python setup.py build_ext --inplace
创建模块时,始终使用-DNDEBUG
调用gcc。无论何时运行代码,都不会检查断言。
我找不到使用-DNDEBUG
覆盖setup.py
的方法。这可能吗?
目前,我发现处理此问题的唯一方法是使用python setup.py
使用的选项手动调用cython,gcc和g ++,但要取出-DNDEBUG
。但必须有一个更简单的方法。
答案 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>
,这将导致断言检查被编译到您的代码中。