C++ c++;链接和编译标志

C++ c++;链接和编译标志,c++,compilation,makefile,g++,flags,C++,Compilation,Makefile,G++,Flags,我可能有一个愚蠢的问题,但没有问题是愚蠢的,我会问它。。。让我们假设我有文件matrix.hpp和matrix.cpp。在这些文件中,我使用assert(…)来确保遵守某些条件。我编译这个文件并得到一个matrix.o文件。现在我将在许多不同的程序中使用这个matrix.o文件,其中一些只是测试,需要检查assert(…)条件,另一些是不需要这些检查的工作程序 我的问题是:我是否可以编译矩阵.o而不使用-DNDEBUG标志,因此通常会检查断言(…)条件。但是当我为一个不需要检查的程序链接.o文件

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

我的问题是:我是否可以编译
矩阵.o
而不使用
-DNDEBUG
标志,因此通常会检查
断言(…)
条件。但是当我为一个不需要检查的程序链接.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 $^
好的,谢谢你的回答!因此,我不能简单地使用flags-DNDEBUG来实现这一点。如果每次在我添加的矩阵文件中使用“assert(…)”,会怎么样

#ifdef CHECK
assert(...) 
#endif

现在,当我编译“test”程序时,我使用了一个CHECK标志,但没有使用“prog”程序?我想这也行不通……

简单的回答是。根据具体情况,您可能会使用一些巧妙的技巧(例如,在不同的“assert failed”函数中链接)


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

不,不适用于GCC。我看到两种选择:

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

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

    PS:显然(?),matrix.hpp中定义的函数中的任何断言(假设是prog.cpp和test.cpp中的include-d)都将按您想要的方式工作。谢谢!是的,我考虑过抛出一个异常,但我不想这样做,因为运行时成本不断增加……我认为有两个问题是相关的:哪些依次引用