0

我最近开始为 C++ 项目编写单元测试(使用GoogleTest )。构建主项目相当简单:我使用 GCC-MM-MD标志为我的目标文件自动生成依赖项,然后将所有目标文件链接在一起以输出可执行文件。没有惊喜。

但是当我正在编写单元测试时,有没有办法让 make 或 GCC 找出编译每个测试需要哪些目标文件?现在,我有一个相当幼稚的解决方案(如果你可以这样称呼它),它为每个单元测试编译所有可用的目标文件,这显然是浪费(在时间和空间方面)。有没有办法(使用 make、gcc、sed 或其他任何方法)以类似于为原始源文件生成依赖项的方式来判断给定单元测试需要哪些目标文件?

4

4 回答 4

1

您应该寻找更高抽象的项目管理,例如CmakeGNU Automake

于 2010-07-27T13:44:29.287 回答
1

听起来您有两组源文件:一组实际实现您的程序,另一组是所有单元测试。我假设每个单元测试都有自己的main功能,并且单元测试永远不需要相互调用。

如果这一切都是真的,您可以将第一组中的所有文件放在一个静态库中,并将每个单元测试链接到该库。链接器将自动从库中仅提取所需的目标文件。

在具体的 Makefile 术语中:

LIBRARY_OBJECTS = a.o b.o c.o d.o # etc
UNIT_TESTS = u1 u2 u3 u4 # etc
UNIT_TEST_OBJECTS = $(UNIT_TESTS:=.o)

libprogram.a: $(LIBRARY_OBJECTS)
        ar cr $@ $?

$(UNIT_TESTS): %: %.o libprogram.a
        $(CC) $(CFLAGS) -o $@ $< -lprogram
于 2010-07-27T18:51:53.227 回答
0

在你的 Makefile

     SOURCES.cpp = a.cpp b.cpp ...
     OBJECTS = $(SOURCES.cpp:%.cpp=%.o)

     all: program

     program: $(OBJECTS)
          $(LINK) -o $@ $(OBJECTS)
于 2010-07-27T15:21:28.300 回答
0

也许,取决于您的测试系统的有序程度。

如果头文件和源文件之间存在很好的一对一关系,那么您可以使用一些文本转换函数(或对 sed 的调用)来转换您已经拥有的机器生成规则:

foo.o: foo.cc foo.h bar.h gaz.h

转化为相应测试的规则:

unit_test_foo: unit_test_foo.o foo.o stub_bar.o stub_gaz.o

或者,如果您使用大量没有相应标头的存根(这是一个警告标志),您可以链接stub_foo.o 之外的每个存根。这些目标文件很小,不经常更改,因此很便宜。

于 2010-07-27T18:32:50.377 回答