如何在构建Cython模块时覆盖-DNDEBUG编译标志

How to override -DNDEBUG compile flag when building a Cython module

本文关键字:覆盖 -DNDEBUG 编译 标志 模块 构建 Cython      更新时间:2023-10-16

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

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

目前,我发现处理这个问题的唯一方法是手动调用Cython, GCC和g++python setup.py使用的选项,但拿出-DNDEBUG。但是一定有更简单的方法

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

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

在构建输出中,您将看到-DNDEBUG后面跟着-UNDEBUG,它覆盖了它。有关扩展选项的更多信息,请参阅distutils文档。

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

您可以在包含<cassert>之前手动取消定义NDEBUG(如果已定义)。将以下几行添加到包含这些断言语句的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

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