我最近开始为 C++ 项目编写单元测试(使用 GoogleTest)。构建主项目相当简单:我使用 GCC 的 -MM
和 -MD
标志自动为我的目标文件生成依赖项,然后我将所有目标文件链接在一起输出可执行文件。没有惊喜。
但是当我编写单元测试时,有没有办法让 make 或 GCC 找出编译每个测试需要哪些目标文件?现在,我有一个相当幼稚的解决方案(如果你可以这样调用它的话),它将所有可用的目标文件编译在一起用于每个单元测试,这显然是浪费(在时间和空间方面)。有没有一种方法(使用 make、gcc、sed 或其他任何方法)以类似于为原始源文件生成依赖项的方式来判断给定单元测试需要哪些目标文件?
最佳答案
听起来您有两组源文件:一组实际实现您的程序,另一组是所有单元测试。我假设每个单元测试都有自己的 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
关于c++ - 自动选择目标文件进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3344173/