2012-07-06 169 views
0

我正在嘗試創建一個makefile文件,該文件通過.o文件自動編譯並將我的.cpp文件鏈接到可執行文件中。我無法工作的是自動生成(甚至是手動)依賴關係。當我取消註釋下面的評論代碼時,當我運行make build時沒有任何重新編譯。我所得到的是make: Nothing to be done for 'build'.,即使x.h(或任何.h文件)已經改變。我一直在試圖從這個問題中學習:Makefile, header dependencies,dmckee的回答,特別是。爲什麼這個makefile不工作?說明:我可以編譯所有內容,但是當我修改任何頭文件時,依賴它的.cpp文件不會更新。因此,如果我編譯我的整個源代碼,那麼我在頭文件中更改#define,然後運行make build,並且我得到Nothing to be done for 'build'.(當我取消註釋下面代碼的註釋塊時)。Makefile - 依賴關係生成

CC=gcc 
CFLAGS=-O2 -Wall 
LDFLAGS=-lSDL -lstdc++ 
SOURCES=$(wildcard *.cpp) 
OBJECTS=$(patsubst %.cpp, obj/%.o,$(SOURCES)) 
TARGET=bin/test.bin 

# Nothing happens when i uncomment the following. (automated attempt) 
#depend: .depend 
# 
#.depend: $(SOURCES) 
# rm -f ./.depend 
# $(CC) $(CFLAGS) -MM $^ >> ./.depend; 
# 
#include .depend 

# And nothing happens when i uncomment the following. x.cpp and x.h are files in my project. (manual attempt) 
#x.o: x.cpp x.h 


clean: 
    rm -f $(TARGET) 
    rm -f $(OBJECTS) 

run: build 
    ./$(TARGET) 

build: $(TARGET) 

$(TARGET): $(OBJECTS) 
    @mkdir -p $(@D) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

obj/%.o: %.cpp 
    @mkdir -p $(@D) 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

回答

2

這可能需要幾次迭代。

1)我無法從第一種方法中重現您的結果(並且您必須比「沒有任何事情發生」更明確 - Make實際上是否產生任何輸出?)。此:

depend: .depend 

.depend: $(SOURCES) 
    rm -f ./.depend 
    $(CC) $(CFLAGS) -MM $^ >> ./.depend; 

include .depend 

似乎按預期工作。我建議你試試$(info sources: $(SOURCES))來驗證該變量是否包含你認爲它的文件名。

2)我無法從第二種方法中重現您的結果(並且您必須比「沒有任何事情發生」更明確 - Make實際上是否產生任何輸出?)。當第一種方法被註釋掉時,您嘗試x.o: x.cpp x.h,是嗎?

編輯:
讓我們專注於x.o。它是否包含#include "x.h"?當您取消註釋第一部分和make x.o時,是否生產(或修改).depend.depend中是否有與x.o有關的行,如果有的話是什麼?如果您然後修改x.h然後make x.o,Make會做什麼?

+0

我運行了'$(info sources:$(SOURCES))',我的源代碼是我認爲它們的,那就是所有.cpp文件,而不是頭文件。我想頭文件不應該包含源文件,因爲它們只能在從#include指令調用時編譯。另外,我試圖澄清我的問題,告訴我是否需要進一步澄清。 – nijoakim 2012-07-07 09:24:44

+0

我按照以下教程解決了這個問題:http://scottmcpeak.com/autodepend/autodepend.html。我將?obj /%。o:%.cpp'-規則更改爲本教程中所述的內容。我的問題是依賴文件沒有包含整個路徑,但錯過了「obj /」。感謝所有的幫助!你最近的編輯讓我發現了問題! :D – nijoakim 2012-07-10 18:29:13

1

您只用$(CC) -MM解決一種依賴關係。還有其他各種變化的命令選項(例如-DDO_SOMETHING_ELSE),或庫導出的一組不同的符號。傳統使得爲調試不一致的可執行文件提供了許多樂趣!

這就是makepp的地方。自動檢測依賴關係。它不僅在任何類型的依賴性保證這一點時重建目標。它甚至把所有東西都聯繫在一起,並從底層構建需要的東西。即如果您的鏈接器有-lmystuff選項,並且您有構建libmystuff.so或.a的規則,只需要這些,它就會及時生成。同樣,您可以添加一些甚至不存在的文件 - 解決方案不可能。

+0

謝謝,但我更喜歡定期製作。:) – nijoakim 2012-07-10 19:04:57