首页 > 解决方案 > Makefile:将多个单元测试 *.out 文件编译为单个测试可执行文件 (C++)

问题描述

如果这是一个重复的问题,请原谅我。我对编写 Makefile 还很陌生,所以我不确定如何找到我要找的东西。

我正在熟悉 Boost.Test 并且正在逐个文件编写单元测试。

这是我的目录结构:

- cpp
    - sim
        - Makefile
        - bin
        - src
            - ExampleClass.cpp
    - tests
        - Makefile
        - bin
        - src
            -ExampleClass_T.cpp

本质上,我想使用 Boost 编写单独的 *.cpp 测试用例文件,如上所示。

这是我的测试/Makefile的内容:

CC = g++
CPPFLAGS = -g -v -Wall -I$(ODIR_TEST) -I$(SDIR_TEST) \
-I$(SDIR) -I$(ODIR) -I$(BOOST_ROOT)
ODIR_TEST = ./bin
SDIR_TEST = ./src
ODIR = ../sim/bin
SDIR = ../sim/src

%.out : $(SDIR_TEST)/%.cpp
        $(CC) $(CPPFLAGS) -o $< $@

执行会make生成一个无目标。停止。错误信息。关于为什么 make 认为没有目标的任何想法?%.out 不会在这里充当目标,还是通配符不能以这种方式起作用?

我认识到在上面的 Makefile 中,我试图为每个 *.cpp 文件生成一个 *.out 文件;另外,我想生成一个最终的可执行文件,它是所有生成的 *.out 文件的顶点。这是可能的,还是我错误地接近这个?

任何其他建议或 Makefile 最佳实践,尤其是在测试自动化方面,将不胜感激。

标签: makefile

解决方案


我似乎找到了一种解决方法,尽管它可能会被优化。

PROG = main
CC = g++
CPPFLAGS = -g -Wall -I$(ODIR_TEST) -I$(SDIR_TEST) \
-I$(SDIR) -I$(ODIR) -I$(BOOST_ROOT)
ODIR_TEST = ./bin
SDIR_TEST = ./src
OUTDIR = ./execs
ODIR = ../sim/bin
SDIR = ../sim/src
TEST_EXEC_NAMES = $(notdir $(basename $(wildcard $(SDIR_TEST)/*.cpp)))

# default rule (main.cpp)
$(OUTDIR)/$(PROG) : $(SDIR_TEST)/main.cpp $(TEST_EXEC_NAMES)
        $(CC) $(CPPFLAGS) -o $@ $<

% : $(SDIR_TEST)/%.cpp
        $(CC) $(CPPFLAGS) -o $(OUTDIR)/$@ $<

我在第一条规则中指定了一个默认目标。我将$(TEST_EXEC_NAMES)其作为先决条件包括在内,以确保我所有的个人测试可执行文件都是使用模式规则构建的。

从对应的 .cpp 文件中指定我的可执行文件名是通过一系列函数调用(通配符、basename 和 notdir)来完成的。

同样,这肯定不是我完成任务的最快方式,但它让我陷入了编译错误。


推荐阅读