2014-10-02 20 views
1

這裏是我的.c和.o文件層次:C/C++ Makefile:如何在.c文件和其他目錄中的目標文件之間建立依賴關係?

---/src/IRBuild/main.c 
       func1.c 
       func2.c 
---/inclue/main.h 
      func1.h 
      func2.h 

---/build/IRBuild/main.o 
        func1.o 
        func2.o 
        irbuild 

下面是我在〜/ src目錄/ IRBuild/Makefile中,我不得不建立編譯.c和.h文件的依賴性,這意味着每當.C或.h文件被更改。 「make」會重建對象文件。但因爲我輸出.o文件到〜/ build/IRBuild /,而不是當前目錄,「make」會在我每次創建時重建所有的.o文件。

我應該如何在其他目錄中使用.o文件構建依賴關係?只有在.c,.h或.o文件發生更改時才重新編譯特定文件?

在這裏呆了兩天,非常感謝!

EXE=irbuild 
 

 
# G++ as default compiler 
 
CC=g++ 
 

 
# Compile time flags 
 
CXXFLAGS = -g -Wall 
 

 
# Library paths in addition to /usr/lib 
 
LFLAGS=-std=c++0x 
 

 
# Libraries to link into executable: 
 
#LIBS = -lmylib -lm 
 

 
# Include files directory other than /usr/include 
 
INCLUDES=-I../../include/ 
 

 
SRC=$(wildcard *.cpp) 
 
OBJ=$(SRC:.cpp=.o) 
 
DEP=$(OBJ:.o=.d) 
 
BUILD=../../build/IRBuild 
 
TESTS=../../tests/ 
 

 
OBJS :=$(foreach obj, $(OBJ), $(BUILD)/$(obj)) 
 

 
.PHONY: depend clean 
 

 
all: $(EXE) 
 
     cp $(EXE) $(TESTS) 
 
$(EXE): $(OBJ) 
 
     $(CC) $(CXXFLAGS) $(LFLAGS) $(INCLUDES) -o $(EXE) $(OBJS) 
 

 
.cpp.o: 
 
     $(CC) $(CXXFLAGS) $(LFLAGS) $(INCLUDES) -c $< -o $(BUILD)/[email protected] 
 

 
clean: 
 
     rm -f $(OBJS) $(DEP) $(EXE) 
 

 
depend: .depend 
 
.depend: $(SRC) 
 
     rm -f ./.depend 
 
     $(CC) $(CXXFLAGS) $(LFLAGS) $(INCLUDES) -MM $^ -MF ./.depend; 
 
include .depend 
 

回答

1

您從http://make.mad-scientist.net/rules.html這就是爲什麼它重建他們所有它認爲不存在違反時間規則2。 (在配方鏈接行中的列表$(OBJ)和配方鏈接行中的$(OBJS)也是一個製造文件的「味道」。)

您需要使用一個從您的目標文件正確映射到它們的先決條件的規則。

手動或使用vpath

有許多方法可以使手動方法工作,具體取決於您想要設置多少努力。 vpath方法可能會更容易一點。

使用vpath應該只需要使用$(OBJS)$(EXE) prereqs,然後加入vpath %.cpp .vpath %.h ../../include或類似的東西。

+0

謝謝Etan,你的意思是這條規則違反了規則2嗎? (代碼).cpp.o: $(CC)$(CXXFLAGS)$如果我刪除$(BUILD),那麼$ @只是生成目標文件本身,沒有路徑信息。 而vpath正在處理prerequirement的權利?但我正在談論依賴關係,我如何在其他目錄中使用.o文件構建依賴關係? – MartinGGWW 2014-10-02 15:26:20

+0

是的,該食譜線。你的食譜需要生成*精確*'$ @'而不是它的變體。正確的,'vpath'是針對prereqs的。這就是爲什麼當我提到我說你使用'$(OBJS)'作爲prereqs,因爲在文件名中有'$(BUILD)'路徑,然後讓'vpath'找到這些對象文件的匹配源。 – 2014-10-02 15:44:30

+1

Etan,它的工作原理! 我添加了「vpath%.o ../../build/IRBuild」,然後它就起作用了!謝謝!我沒有15個名譽,所以我不能給你投票。 – MartinGGWW 2014-10-02 15:57:55

相關問題