我有如下一個makefile
,可編譯,並在同一目錄鏈接所有cpp文件:
生成文件:如何生成的目標文件上一級目錄
g++1x:=g++ -std=c++14 -stdlib=libc++ -MMD -MP
cflags:= -Wall -lncurses
TARGET:=matrix.out
CPPFILES:=$(wildcard *.cpp)
OBJDIRECTORY:=.obj
OBJFILES:=$(addprefix $(OBJDIRECTORY)/,$(notdir $(CPPFILES:.cpp=.o)))
.PHONY: install
install: $(OBJDIRECTORY) $(TARGET)
$(OBJDIRECTORY):
mkdir -p $(OBJDIRECTORY)
$(TARGET): $(OBJFILES)
$(g++1x) $(cflags) -o [email protected] $^ -g
$(OBJDIRECTORY)/%.o: %.cpp
#%.o: %.cpp
$(g++1x) -c -o [email protected] $< -g
-include $(addprefix $(OBJDIRECTORY)/,$(notdir $(CPPFILES:.cpp=.d)))
.PHONY: clean
clean:
rm -f $(TARGET)
rm -rf $(OBJDIRECTORY)
當我執行make
,一個.obj
會創建並且所有obj文件都在其中。另外還會生成一個可執行文件。現在一切都很好。
現在我試圖組織我的項目。我的計劃是創建一些子目錄,每個子目錄都包含一個makefile。當我執行一個makefile時,它會在某個固定路徑上生成obj文件。最後,我可以執行makefile來鏈接main.cpp
和所有obj文件來獲取可執行文件。
但我不知道如何寫這樣一個makefile子目錄。我已經做了如下嘗試,但它不起作用。
project
|--- main.cpp
|--- makefile
|--- subdir
|--- test.h
|--- test.cpp
|--- makefile
這是我在project/subdir
生成文件:
g++1x:=g++ -std=c++14 -stdlib=libc++ -MMD -MP
cflags:= -Wall -lncurses
CPPFILES:=$(wildcard *.cpp)
OBJDIRECTORY:=../.obj
TARGET:=$(OBJDIRECTORY)/%.o
OBJFILES:=$(addprefix $(OBJDIRECTORY)/,$(notdir $(CPPFILES:.cpp=.o)))
.PHONY: install
install: $(OBJDIRECTORY) $(TARGET)
$(OBJDIRECTORY):
mkdir -p $(OBJDIRECTORY)
$(TARGET): %.cpp
#%.o: %.cpp
$(g++1x) -c [email protected] $< -g
-include $(addprefix $(OBJDIRECTORY)/,$(notdir $(CPPFILES:.cpp=.d)))
.PHONY: clean
clean:
rm $(OBJDIRECTORY)/%.o
錯誤:
make: *** No rule to make target
../.obj/%.o', needed by
install'. Stop.
你可能想閱讀論文「Recursive Make Considered Harmful」http://aegis.sourceforge.net/auug97.pdf。 –