2017-04-10 52 views
0

我有以下makefile片段來編譯我的C++項目。如何從Makefile中的另一條規則調用涉及`%`的規則?

obj/%.o: src/%.cpp 
    $(CXX) $(CFLAGS) -c $< -o [email protected] 

現在我想鏈接.o文件。但我希望能夠調用鏈接的規則名稱,如make build/main,以編譯AND鏈接。

無論是這樣的:

build/main: $(wildcard obj/*.o) 
    $(CXX) $^ -o [email protected] 

的作品,因爲它僅鏈接和無法編譯,就像我會通過this answer期待;

也不是這:

build/main: obj/%.o 
    $(CXX) $^ -o [email protected] 

與錯誤:

No rule to make target 'obj/%.o', needed by 'build/main'. Stop.

即使它是必要的。

+1

'build/main:$(wildcard obj/*。o)'不起作用,因爲通配符在第一次讀取時會擴展(在構建.o之前,存在於文件系統中,所以它會擴展爲空)。 – blackghost

回答

2
SOURCES := $(wildcard src/*.cpp) 
OBJECTS := $(patsubst src/%.cpp, obj/%.o, $(SOURCES)) 

build/main: $(OBJECTS) 
    $(CXX) $^ -o [email protected] 
+0

'SOURCES'是否展開爲'src/main.cpp src/other.cpp'或'main.cpp other.cpp'? – kim366

+1

@ kim366:你可以自己看看:在作業之後放置'$(info擴展爲$(SOURCES))'。 – Beta