【问题标题】:Automatically choosing object files for compilation自动选择目标文件进行编译
【发布时间】:2011-03-21 15:01:30
【问题描述】:

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

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

【问题讨论】:

    标签: c++ gcc makefile dependencies object-files


    【解决方案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
    

    【讨论】:

    • 谢谢,@Zack - 一针见血。
    【解决方案2】:

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

    如果头文件和源文件之间存在良好的一对一关系,那么您可以使用一些文本转换函数(或调用 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。这些目标文件很小,不经常更改,因此很便宜。

    【讨论】:

      【解决方案3】:

      在你的 Makefile 中

           SOURCES.cpp = a.cpp b.cpp ...
           OBJECTS = $(SOURCES.cpp:%.cpp=%.o)
      
           all: program
      
           program: $(OBJECTS)
                $(LINK) -o $@ $(OBJECTS)
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • David Wheeler 说“计算机科学中的所有问题都可以通过另一个层次的间接性来解决。”因此,尽管您做出了有效的观察(您的建议不会被置若罔闻),但它实际上并不能直接回答问题。
        • 为了澄清,我假设你已经理解 make target: dependencies 语法。在重新阅读您的问题时,我看到了足够的歧义,使这一点不清楚。如果您实际上是在寻求这方面的指导,我会向您推荐 rlduffy 的回答,因为它完全符合您的需要。不过,我假设您正在寻找更高水平的自动化。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 2020-03-15
        • 1970-01-01
        • 1970-01-01
        • 2016-07-11
        • 2017-04-01
        相关资源
        最近更新 更多