【问题标题】:c++ linking and compiling flagsc++ 链接和编译标志
【发布时间】:2013-06-05 08:17:56
【问题描述】:

我可能有一个愚蠢的问题,但没有问题是愚蠢的,我会问它...假设我有文件matrix.hppmatrix.cpp。在这些文件中,我使用assert(...) 来确保遵守某些条件。我编译这个文件并得到一个matrix.o 文件。现在我将在许多不同的程序中使用这个matrix.o 文件,其中一些只是测试,需要检查assert(...) 条件,其他是不需要这些检查的工作程序。

我的问题是:我可以在没有-DNDEBUG 标志的情况下编译matrix.o,因此通常会检查assert(...) 条件。但是当我为不需要检查的程序链接 .o 文件时,我添加了这个标志而不重新编译 matrix.o 文件。

更准确地说,这会做我想要的吗:

# the test program with the "assert(..)" checks    
test:test.o matrix.o
    gcc -o $@ $^
test.o:test.cpp matrix.hpp
    gcc -c $^

# the real program without the "assert(..)" checks
prog:prog.o matrix.o
    gcc -o $@ $^ -DNDEBUG
prog.o:prog.cpp matrix.hpp
    gcc -c -DNDEBUG $^

# the matrix.o that can be either checked or not if the -DNDEBUG flag
# is given when the .o files are linked
matrix.o:matrix.cpp matrix.hpp
    gcc -c $^

好的,谢谢您的回答!所以我不能简单地使用标志-DNDEBUG。如果每次我在我添加的矩阵文件中使用“assert(...)”怎么办:

#ifdef CHECK
assert(...) 
#endif

现在当我编译“测试”程序时,我使用 CHECK 标志,但不使用“prog”程序?我想这也行不通……

【问题讨论】:

标签: c++ compilation makefile g++ flags


【解决方案1】:

简短的回答是。根据您的具体情况,您可能会采用一些巧妙的技巧(例如,链接到不同的“断言失败”函数)。

您是否考虑过抛出异常而不是断言?然后,“prog”和“test”可以采用不同的方法来处理它。

【讨论】:

  • PS:显然(?),matrix.hpp 中定义的函数中的任何断言(假设是 prog.cpp 和 test.cpp 中的#include-d)都会按照您想要的方式工作。跨度>
  • 谢谢!是的,我考虑过抛出异常,但我不想这样做,因为运行时成本会增加......
【解决方案2】:

不,不是 GCC。我看到两个选项:

  1. 编译两个版本的matrix.o 并将适当的版本链接到每个程序中,或者
  2. assert 替换为引发异常的手动检查。

即使在非测试程序中,后一个选项显然也会产生一些运行时开销,因此请谨慎使用(不要在内部循环中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多