我正在使用Check for C单元测试。对于我创建的每个C库文件,应该有一个测试文件,它应该生成一个从测试和源代码链接的单个可执行文件。然后应该运行此可执行文件以确保所有测试都通过。
当只有一个测试文件和一个源文件时,一切都很好。只要我添加第二个源文件和相应的测试文件,它就会尝试将它们全部链接到1个可执行文件中。
如何获得第二条规则将1个TEST_SRC和匹配的SRC和头文件拉入TEST_OBJ,然后将2个目标文件编译成可执行文件?下面是我当前的Makefile
OUT_DIR=bin
BUILD_DIR=build
TEST_BUILD_DIR=test_build
SRC_DIR=src
TEST_SRC_DIR=tests
SRC= $(wildcard $(SRC_DIR)/*.c)
TEST_SRC= $(patsubst $(SRC_DIR)/%.c, $(TEST_SRC_DIR)/%_tests.c, $(SRC))
TEST_OBJ= $(patsubst $(TEST_SRC_DIR)/%.c, $(TEST_BUILD_DIR)/%.o, $(TEST_SRC))
OBJ= $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(SRC))
$(OUT_DIR)/string_calculator_tests: $(TEST_OBJ)
gcc -o $@ $^ `pkg-config --cflags --libs check`
$(TEST_OBJ): $(TEST_SRC) $(SRC)
gcc -c -o $@ $^ `pkg-config --cflags --libs check`
任何帮助都将不胜感激。
答案 0 :(得分:1)
有点不清楚你想要这个makefile的行为,但我们可以分阶段进行。
看看这条规则:
$(TEST_OBJ): $(TEST_SRC) $(SRC)
gcc -c -o $@ $^ `pkg-config --cflags --libs check`
每个对象都是由所有源文件构建的。你似乎没有OBJ
的规则。所以让我们用两个静态模式规则替换它:
$(TEST_OBJ): $(TEST_BUILD_DIR)/%.o : $(TEST_SRC_DIR)/%.c
gcc -c -o $@ $< `pkg-config --cflags --libs check`
$(OBJ): $(BUILD_DIR)/%.o : $(SRC_DIR)/%.c
gcc -c -o $@ $< `pkg-config --cflags --libs check`
然后是从一对目标文件构建可执行文件的规则:
TESTS = $(patsubst $(SRC_DIR)/%.c, $(TEST_BUILD_DIR)/%_test, $(SRC))
$(TESTS): $(TEST_BUILD_DIR)/%_test : $(BUILD_DIR)/%.o $(TEST_BUILD_DIR)/%_tests.o
gcc -o $@ $^ `pkg-config --cflags --libs check`
然后建立所有测试的规则:
.PHONY: all_tests
all_tests: $(TESTS)
这应该足以让你入门。一旦这样做,有许多可能的改进,例如运行测试的目标,以及使用vpath
等高级技术编写测试的更整洁的方法。我们甚至没有谈到头文件和依赖项处理...