2017-10-12 34 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) 

所以每個目標取決於其來源只有(頭的依賴應該添加的地方)和目標目錄只有當缺少建設。