c++ - 自动选择目标文件进行编译

标签 c++ gcc makefile dependencies object-files

我最近开始为 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/

相关文章:

c - 为检查测试 C 框架构建库

c++ - 为什么用 C++ 编写一个带有 2 个循环变量的 for 循环是 'hard'?

makefile - GNU 生成文件 : multiple outputs from single rule + preventing intermediate files from being deleted

c++ - 用于遍历继承层次结构的 Static_cast 与 dynamic_cast

linux - 执行内联汇编

ubuntu - Ubuntu 中的 Raspberry PI 交叉编译 QT GUI 应用程序

iphone - 使用 LLVM 构建和任何优化都会导致应用程序在启动时崩溃

makefile - Makefile 中是否可能依赖符号链接(symbolic link)?

c++ - 从 sstream 变量中提取字符串后,如何获取剩余的字符串?

c++ - 帮助理解生成的部分汇编代码