2009-04-24 36 views
1

我是新來makefile並面臨一些問題。我創建了以下makefile。它工作正常。但是當我修改main.cpp並運行使得,它說「一切都是最新的」。我需要做一個清潔並再次運行make,一切都會工作。makefile不構建程序的更新部分 - C++

看起來像這個makefile有一些問題,我無法弄清楚它出錯的地方。任何人都可以幫助我找出這個makefile中的錯誤,以及它爲什麼不構建更改的文件?

#Main makefile which does the build 

CFLAGS = 
CC = g++ 
PROG = fooexe 

#each module will append the source files to here 
SRC := 

#including the description 
include foo/module.mk 

OBJ := $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) main.o 

#linking the program 
fooexe: $(OBJ) 
    $(CC) -o $(PROG) $(OBJ) 

%.o: 
    $(CC) -c $(SRC) -o $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) 

main.o: 
    $(CC) -c main.cpp 

depend: 
    makedepend -- $(CFLAGS) -- $(SRC) 

.PHONY:clean 
clean: 
    find . -name "*.o" | xargs rm -vf 
    rm -vf fooexe 

回答

5

通常.o文件需要對相應的.cpp文件有依賴關係。我認爲這是語法,但不是100%肯定:

%.o : %.cpp 
    $(CC) ... 

main.o : main.cpp 
    $(CC) ... 
+0

你是男人。這工作。我忘了給那個。 – 2009-04-24 04:17:17

+0

如果您只想重建已更改的文件,則填寫正確的命令以替換「...」也很重要。 – bk1e 2009-04-24 05:33:36

0

運行你的make打開調試,看看你得到什麼。

Make是一個如此古老的代碼,它非常確定它正在做它認爲你想要的東西。

事實上,你使用find來找到你的.o文件,這讓我認爲你有真實的東西的子目錄;如果是這樣,你需要確保Make可以看到它們。

+0

我相信make可以看到它們。因爲它乾淨後效果很好。問題在於第一次構建之後。 – 2009-04-24 04:13:18

1

使用的main.cpp你的規則 - main.o - 不指定任何東西main.o依賴。您至少需要該行爲「main.o:main.cpp」,還需要main.o依賴的任何其他源文件。

我看到你有一個使用makedepend的依賴規則;你正確使用它嗎?我沒有用它自己,但我總是最後我生成文件的東西,如下列:

depend: 
    mv Makefile Makefile.bak 
    sed '/^#DO NOT DELETE THIS LINE$$/,$$d' Makefile.bak > Makefile 
    echo '#DO NOT DELETE THIS LINE' >> Makefile 
    echo '#' >> Makefile 
    $(CC) -MM *.c >> Makefile 

# 
#DO NOT DELETE THIS LINE 
#

然後當我運行「讓依賴」我得到像下面幾行:

main.o: main.c main.h otherstuff.h 
otherstuff.o: otherstuff.c otherstuff.h
5
%.o: 
    $(CC) -c $(SRC) -o $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) 

這是一個告訴make的模式規則,「無論何時需要.o文件並且不存在,都可以在$(SRC)的所有.cpp文件上運行$(CC)。」它們在更改時不會重新編譯.cpp文件,因爲它沒有列出任何先決條件。如果所需的.o文件已經存在,那麼沒有理由執行$(CC)命令。

如果更改第一行%.o: %.cpp安迪·懷特建議,然後將更新的規則現在告訴make,「無論何時需要生成一個.o文件,不存在或高於相應.cpp文件舊,在所有運行$(CC).cpp文件在$(SRC)。「

這樣比較好,但仍然存在一個問題:更新後的規則總是會編譯所有.cpp文件,即使是最新的文件。要解決此問題,規則的命令部分需要將正確的.cpp文件重新編譯爲正確的.o文件。爲此,您可以使用自動變量,如$<(第一先決條件),並[email protected](目標):

%.o: %.cpp 
    $(CC) -c $< -o [email protected] 

GNU Make Manual有更多的解釋和細節。