在我的项目中,我有一个测试/文件夹。在此文件夹中,每个cpp文件将构建到Build / test /文件夹中的单个可执行文件中。
我设置了以下变量。
BUILD_DIR = Build
TEST_SOURCES = $(wildcard test/*.cpp)
TEST_EXEC = $(addprefix $(BUILD_DIR)/,$(basename $(TEST_SOURCES)))
然后我创建了以下规则。
$(TEST_EXEC): $(TEST_SOURCES)
@mkdir -p $(@D)
$(CC) $(INCLUDES) $^ -o $@
test: $(TEST_EXEC)
all: test
现在我的测试目录中有两个cpp文件(test1.cpp和test2.cpp)。这个问题是test1目标实际上只依赖于test1.cpp而不是test2.cpp。
/usr/local/gcc-7.2/bin/g++-7.2 -I/usr/local/gcc-7.2/include/ -Iinclude/ test/test1.cpp test/test2.cpp -o Build/test/test1
/tmp/ccAQUS3n.o: In function `main':
test2.cpp:(.text+0x0): multiple definition of `main'
/tmp/ccQ8lewg.o:test1.cpp:(.text+0x0): first defined here
Makefile:10: recipe for target 'Build/test/test1' failed
有没有办法只从$ TEST_SOURCES中取出相应的依赖项,而忽略其他依赖项。我不想......
Build/test/test1: test/test1.cpp
Build/test/test2: test/test2.cpp
而不是
Build/test/test1: test/test1.cpp test/test2.cpp
Build/test/test2: test/test1.cpp test/test2.cpp
答案 0 :(得分:0)
我喜欢使用VPATH和隐式规则。
BUILD_DIR = Build
TEST_SOURCES = $(wildcard test/*.cpp)
TEST_EXEC = $(basename $(TEST_SOURCES))
VPATH = $(BUILD_DIR):test
all: test
test: $(TEST_EXEC)
%: %.cpp | $(BUILD_DIR)
echo $(CC) $(INCLUDES) $^ -o $(BUILD_DIR)/$@
$(BUILD_DIR):
mkdir -p $(@D)
所以每个目标只依赖于它的源代码(应该在某处添加标题依赖项),目标目录只有在缺失时才构建。