我最近开始为C ++项目编写单元测试(使用GoogleTest)。构建主项目非常简单:我使用GCC的-MM
和-MD
标志自动生成我的目标文件的依赖项,然后将所有目标文件链接在一起以输出可执行文件。没有surpirses。
但是当我正在编写单元测试时,有没有办法让make或GCC找出编译每个测试需要哪些目标文件?现在,我有一个相当天真的解决方案(如果你可以称之为),它将所有可用的目标文件一起编译为每个单元测试,这显然是浪费(在时间和空间方面)。是否有一种方法(使用make,gcc,sed或其他任何方法)来判断给定单元测试需要哪些目标文件,其方式类似于为原始源文件生成依赖项的方式?
答案 0 :(得分:1)
您应该考虑项目管理的更高抽象,例如Cmake或GNU Automake。
答案 1 :(得分: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
答案 2 :(得分:0)
在你的Makefile中
SOURCES.cpp = a.cpp b.cpp ...
OBJECTS = $(SOURCES.cpp:%.cpp=%.o)
all: program
program: $(OBJECTS)
$(LINK) -o $@ $(OBJECTS)
答案 3 :(得分: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。这些目标文件很小,不经常更改,所以它很便宜。