2017-04-04 148 views
0

我有如下一個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.

+1

你可能想閱讀論文「Recursive Make Considered Harmful」http://aegis.sourceforge.net/auug97.pdf。 –

回答

1

不要放置在路徑的父文件;解決問題:在根目錄中有Makefile$(MAKE)是子目錄,並在那裏使用obj文件。

0

這裏有幾個問題。

在您的原始生成文件中,變量TARGET包含字符串「matrix.out」,並且一切正常。

在你subdir/makefile,變量TARGET包含字符串「../.obj/%.o」,和你問make來構建。唯一的規則,它可以找到:

$(TARGET): %.cpp 
    ... 

沒有幫助,因爲沒有所謂的「%的.cpp」 任何地方文件。

我建議你嘗試這樣的事:

install: $(OBJFILES) 

$(OBJFILES): $(OBJDIRECTORY)/%.o: %.cpp $(OBJDIRECTORY) 
    $(g++1x) -c [email protected] $< -g 

一旦你得到的工作,你可以不用擔心得到主生成文件調用陽光品牌的問題。

相關問題