【问题标题】:Makefile for Unit Tests in C++用于 C++ 中的单元测试的 Makefile
【发布时间】:2010-09-16 08:01:29
【问题描述】:

我正在努力编写能够正确构建我的单元测试的 Makefile。例如,假设文件结构如下所示

src/foo.cpp
src/foo.hpp
src/main.cpp
tests/test_foo.cpp
tests/test_all.cpp

所以,要构建可执行的 test_all,我需要构建 test_foo.o,它又依赖于 test_foo.cpp,但也依赖于 src/foo.o。

在这种情况下,最佳做法是什么?父文件夹中有一个 Makefile?每个文件夹一个 Makefile?如果是这样,我如何管理跨文件夹的依赖关系?

【问题讨论】:

    标签: c++ unit-testing makefile


    【解决方案1】:

    通常的做法是每个目录都有一个 Makefile。这就是我在阅读“Recursive Make Considered Harmfull”(http://miller.emu.id.au/pmiller/books/rmch/)之前的建议。现在我推荐一个 Makefile。还要检查自动依赖生成——现在你甚至不需要弄清楚你的测试依赖什么。你所需要的只是一些目标。

    【讨论】:

    • 感谢 dave 非常有趣的阅读。但是,尝试真正实现一个非递归的 Makefile 似乎非常复杂,如xs4all.nl/~evbergen/nonrecursive-make.html 所示——这对于我参与的中小型项目来说似乎工作量太大。
    • 他们在这个例子中做的不仅仅是一个 Makefile。在阅读那篇文章后大约 2 小时内,我设置了一个顶级 Makefile 阅读他们的说明,没有花里胡哨(+另外 2-4 小时前阅读有关 make)
    • 我为我的整个项目写了一个makefile,它真的没有那么复杂,但是我的项目只是一个.c 和.h 文件...
    • 你可以有多个 makefile 并且 NOT 是递归的。区别在于顶部 makefile 中的 make -C directoryinclude directory/Makefile
    【解决方案2】:

    通常的做法是为每个文件夹创建一个 Makefile。这是根文件夹的简单 Makefile.am 脚本:

    #SUBDIRS = src tests
    all:
        make -C ./src
        make -C ./tests    
    install:
        make -C ./src install
    uninstall:
        make -C ./src uninstall
    clean:
        make -C ./src clean
    test:
        make -C ./tests test
    

    src 文件夹对应的 Makefile.am 如下所示:

    AM_CPPFLAGS = -I./
    
    bin_PROGRAMS = progName
    
    progName_SOURCES = foo.cpp main.cpp
    LDADD = lib-to-link
    
    progName_LDADD = ../libs/
    
    tests

    Makefile.am 看起来很相似:

    AM_CPPFLAGS = -I../src
    
    bin_PROGRAMS = tests
    
    tests_SOURCES = test_foo.cpp test_all.cpp
    

    使用 automake 从 .am 文件生成 Makefile.in 文件。 configure 脚本将使用 .in 文件来生成 Makefile。 (对于小型项目,您希望直接手动编写 Makefile)。

    【讨论】:

    • 这似乎没有考虑到 test_all.cpp 对 src/foo.o 的依赖。例如。 make clean 之后会发生什么;在顶级目录中进行测试?
    • 如果测试是从main.cpp驱动的,就不会有任何依赖问题。
    • 但是 main.cpp 将是应用程序的可执行文件,而不是驱动测试。执行测试的可执行文件应位于测试文件夹中。
    • @Michael 你试过tests_SOURCES = test_foo.cpp test_all.cpp ..\src\foo.cpp 吗?我举了一个例子,这样你就可以轻松地学习剩下的:-)
    • 感谢 Vijay,这对我来说是最后一块拼图。我不知道是否正确处理了跨文件夹的依赖关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    相关资源
    最近更新 更多