如何在构建Cython模块时覆盖-DNDEBUG编译标志
How to override -DNDEBUG compile flag when building a Cython module
我有一个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
,这将导致断言检查被编译到您的代码中。
相关文章:
- 使用ios:ate写入到流会覆盖现有文件
- 我可以重新分配/覆盖std::字符串吗
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 使用子类覆盖基类中定义的函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- C++指针在 for 循环中被覆盖
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 为什么我的全局 new() 覆盖被绕过了?
- 被覆盖的函数不会反映在基类中,这是正常行为吗?
- C++找出覆盖同一行的数组
- 专门化模板覆盖函数/避免对象切片
- 重写打印函数而不是覆盖基类
- C++中"覆盖功能的异常规范比基本版本更宽松"的奇怪错误
- 如何在 c++ 中覆盖相同的文本文件
- 覆盖应用程序的低级别键盘挂钩问题
- glBindTexture 是否覆盖活动纹理单元的内容
- 如何在构建Cython模块时覆盖-DNDEBUG编译标志