2017-10-12 78 views
0

在我的项目中我有一个测试/文件夹。在这个文件夹中,每个cpp文件将被构建到Build/test /文件夹中的一个可执行文件中。如何在makefile中使用并行的依赖关系列表?

我设置了以下变量。

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 [email protected] 

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中取得相应的依赖关系,而忽略其他。我wan't有...

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

我喜欢用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)/[email protected] 

$(BUILD_DIR): 
    mkdir -p $(@D) 

所以每个目标取决于其来源只有(头的依赖应该添加的地方)和目标目录只有当缺少建设。