c ++链接和编译标志

时间:2013-06-05 08:17:57

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

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

我的问题是:我可以在没有matrix.o标志的情况下编译-DNDEBUG,因此通常会检查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”程序?我想这也行不通......

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

  1. 编译matrix.o的两个版本,并将相应的版本链接到每个程序,或
  2. 使用引发异常的手动检查替换assert
  3. 后一个选项显然在非测试程序中有一些运行时成本,所以要小心使用它(不要在内部循环中)。