2

我正在使用 Check 进行我的 C 单元测试。对于我创建的每个 C 库文件,都应该有一个测试文件,它应该生成一个从测试和源代码链接的可执行文件。然后应该运行此可执行文件以确保所有测试都通过。

当只有 1 个测试文件和 1 个源文件时,一切正常。一旦我添加了带有相应测试文件的第二个源文件,它就会尝试将它们全部链接到 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`

任何帮助,将不胜感激。

4

1 回答 1

3

您希望此 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. 而且我们甚至还没有谈到头文件和依赖处理......

于 2013-10-07T03:39:28.663 回答