C++ 如何使库构建与断言同时打开和关闭?

C++ 如何使库构建与断言同时打开和关闭?,c++,c,build,C++,C,Build,我编写了一个库,并在程序中使用该库。我经常对程序代码进行更改,在打开断言的情况下运行测试,然后如果测试通过,我会在关闭断言的情况下运行基准测试,以衡量我刚才所做更改对性能的影响。我还希望为测试打开库中的断言,并为基准测试关闭库中的断言。因此,我经常需要在程序和库中同时切换断言设置 为库和程序(使用库)匹配断言设置(NDEBUG)不能是手动的,因为错误的设置意味着未定义的行为,因为头中存在断言(定义冲突导致未定义的行为)事实上,当我用assert-on库构建assert-off程序时,GCC会导致

我编写了一个库,并在程序中使用该库。我经常对程序代码进行更改,在打开断言的情况下运行测试,然后如果测试通过,我会在关闭断言的情况下运行基准测试,以衡量我刚才所做更改对性能的影响。我还希望为测试打开库中的断言,并为基准测试关闭库中的断言。因此,我经常需要在程序和库中同时切换断言设置

为库和程序(使用库)匹配断言设置(NDEBUG)不能是手动的,因为错误的设置意味着未定义的行为,因为头中存在断言(定义冲突导致未定义的行为)事实上,当我用assert-on库构建assert-off程序时,GCC会导致程序崩溃。我还没有找到做这件事的标准方法。我正在考虑让我的库构建系统安装两个名为libfoo-1.0和libfoo-assert-1.0之类的二进制文件(如果它们包含在错误的断言设置(NDEBUG)中,可能会有报头抱怨)


在库和程序之间匹配断言设置的最佳方法是什么,以便同时在库和程序中切换断言设置既简单、快速又不容易出错?

通常,构建系统被设置为执行不同的构建(例如调试/发布、多线程/单线程)。结果库和可执行文件要么放在不同的目录中,要么用不同的名称来区分它们。这也不例外


如果您觉得assert/noassert需要额外的构建类型,那么只需添加这个额外的构建类型。唯一的问题是命名约定,以及如果没有指定特定的生成类型,默认情况下会执行什么操作。

通常,生成系统设置为执行不同的生成(例如调试/发布、多线程/单线程)。结果库和可执行文件要么放在不同的目录中,要么用不同的名称来区分它们。这也不例外


如果您觉得assert/noassert需要额外的构建类型,那么只需添加这个额外的构建类型。唯一的问题是命名约定,以及如果没有指定特定的生成类型,默认情况下会执行什么操作。

“我在关闭断言的情况下运行基准测试”为了拥有合法的基准测试,您需要做的不仅仅是打开和关闭断言。您应该使用调试版本进行调试,使用发布版本进行基准测试。@nicol bolas确实如此!我没有提到这些其他问题,因为我想把重点放在资产上。但你的问题不在于资产。它与将调试版本与发布版本链接有关。@Nicolas发布版本可以打开断言,事实上,据我所知,这是大多数autotools项目的默认设置-如果需要,用户应指示configure关闭断言。在实际发现错误之前,我不会使用调试构建(没有优化)进行测试。你的意思是,我可以问一个关于调试/发布版本的并行安装的问题,因为它们有相同的问题,你不能将它们混合使用。“我在关闭断言的情况下运行基准测试”为了拥有一个合法的基准测试,你需要做的不仅仅是打开和关闭断言。您应该使用调试版本进行调试,使用发布版本进行基准测试。@nicol bolas确实如此!我没有提到这些其他问题,因为我想把重点放在资产上。但你的问题不在于资产。它与将调试版本与发布版本链接有关。@Nicolas发布版本可以打开断言,事实上,据我所知,这是大多数autotools项目的默认设置-如果需要,用户应指示configure关闭断言。在实际发现错误之前,我不会使用调试构建(没有优化)进行测试。你的意思是,我本可以问一个关于并行安装调试/发布版本的问题,因为它们有相同的问题,你不能将它们混合使用?问题是我没有遇到过在unix系统上定义不同版本的库,除了版本号,所以我不知道在命名约定方面的标准实践是什么。它通常是libfoo-assert-1.0还是libfoo_-assert-1.0或libfoo-1.0-assert还是…?除了版本号,我认为Linux上没有标准的命名约定,但我可能错了。查看boost构建系统以了解它们的功能。在我的系统上,各种boost库构建标识符(例如mt表示多线程,d表示调试)用破折号分隔,而不是下划线。我不确定我的系统管理员是否提出了他们自己的命名约定,或者使用了boost构建系统中定义的东西。希望有帮助。找到了boost命名约定的链接:问题是我没有遇到过在unix系统上定义不同版本的库,除了版本号之外,所以我不知道命名约定的标准实践是什么。它通常是libfoo-assert-1.0还是libfoo_-assert-1.0或libfoo-1.0-assert还是…?除了版本号,我认为Linux上没有标准的命名约定,但我可能错了。查看boost构建系统以了解它们的功能。在我的系统上,各种boost库构建标识符(例如mt表示多线程,d表示调试)用破折号分隔,而不是下划线。我不确定我的系统管理员是否提出了他们自己的命名约定,或者使用了boost构建系统中定义的东西。希望有帮助。在boost命名约定上找到此链接: