2013-06-05 72 views
0

我可能有一个愚蠢的问题,但没有问题是愚蠢的我会问它...让我们想象我有文件matrix.hppmatrix.cpp。在这些文件中,我使用assert(...)来确保某些条件得到尊重。我编译这个文件并得到一个matrix.o文件。现在,我将在许多不同的程序中使用这个matrix.o文件,其中一些只是测试,需要检查assert(...)条件,而其他人正在运行的程序不需要这些检查。C++链接和编译标志

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

更确切地说,这会做我想做:

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

# the real program without the "assert(..)" checks 
prog:prog.o matrix.o 
    gcc -o [email protected] $^ -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。如果有什么我的每个矩阵中的文件使用“断言(......)”一次,我补充一下:

#ifdef CHECK 
assert(...) 
#endif 

,现在当我编制了“试验”方案我使用检查标记,但不与“编程”程序?我想这也行不通...

+0

我认为两个相关的问题是相关的:http://stackoverflow.com/questions/8035394/gnu-make-how-to-make-conditional-cflags 其中引用http://stackoverflow.com/questions/ 5127977/makefile-define-compilation-variables-based-on-target-for/5153406#51​​53406 –

回答

0

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

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

+0

PS:显然(?),在matrix.hpp中定义的函数中的任何断言(假定是#include -d prog.cpp和test.cpp)将以您想要的方式工作。 – peterpi

+0

谢谢!是的,我认为抛出一个异常,但我不想这样做,因为运行成本增加... – PinkFloyd

0

不,与GCC无关。我看到两个选项:

  1. 编译matrix.o两个版本,并链接相应的版本为每个程序,或
  2. 与手动检查抛出异常代替assert

即使在非测试程序中,后面的选项显然有一些运行时成本,所以小心使用它(不在内部循环中)。