Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Makefile中,如何为每个C文件构建单独的可执行文件_C_Makefile - Fatal编程技术网

在Makefile中,如何为每个C文件构建单独的可执行文件

在Makefile中,如何为每个C文件构建单独的可执行文件,c,makefile,C,Makefile,我正在使用Check进行C单元测试。对于我创建的每个C库文件,应该有一个测试文件,它应该生成一个从测试和源代码链接的可执行文件。然后应运行此可执行文件以确保所有测试都通过 当只有一个测试文件和一个源文件时,一切都很好。只要我添加第二个源文件和相应的测试文件,它就会尝试将它们全部链接到一个可执行文件中 如何获得第二条规则,将1个TEST_SRC和匹配的SRC和头文件拉入TEST_OBJ,然后将2个对象文件编译成可执行文件?下面是我当前的Makefile OUT_DIR=bin BUILD_DIR=

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

当只有一个测试文件和一个源文件时,一切都很好。只要我添加第二个源文件和相应的测试文件,它就会尝试将它们全部链接到一个可执行文件中

如何获得第二条规则,将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`

如果您有任何帮助,我们将不胜感激。

您希望此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`
然后是生成所有测试的规则:

.PHONY: all_tests

all_tests: $(TESTS)

这应该足以让你开始。一旦这种方法奏效,就有许多可能的改进,例如运行测试的目标,以及使用高级技术(如
vpath
)编写测试的更整洁的方法。我们甚至还没有讨论头文件和依赖项处理…

看看如何分配不同的目标并将它们级联到默认目标中。例如,
maketestpkg1
maketestpkg2
单独构建它们,但是
makeall
只需调用
maketestpkg1-testpkg2
。非常感谢。它就像一场梦。
.PHONY: all_tests

all_tests: $(TESTS)