makefile - 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 最佳实践,尤其是在测试自动化方面,将不胜感激。
解决方案
我似乎找到了一种解决方法,尽管它可能会被优化。
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)来完成的。
同样,这肯定不是我完成任务的最快方式,但它让我陷入了编译错误。
推荐阅读
- r - R vlookup 结合 if...and
- javascript - 为什么当我使用键盘键导航时滚动不起作用
- mysql - 从第二个表中获取 3 列和多条记录的总和
- javascript - JavaScript:解决算法问题
- css - 在闪亮的文本行中更改一个单词/子字符串的字体
- java - 我对这段代码有疑问(无法解析方法:'equals(java.lang.String)
- angular - laravel JWTAuth::attempt 在 heroku 上崩溃
- javascript - 待办事项列表应用程序和列表项长度问题
- javascript - 带有路由器 dom Navlinks 的 React-bootstrap Navbar
- excel - Excel 数据表格