[英]makefile not building updated part of the program - C++
我是makefile的新手,並面臨一些問題。 我創建了以下makefile。 它可以正常工作。 但是,當我修改main.cpp並運行make時 ,它說“一切都是最新的” 。 我需要重新整理一下make ,一切都會正常。
看起來此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
通常,.o文件需要依賴於相應的.cpp文件。 我認為這是語法,但不是100%確定:
%.o : %.cpp
$(CC) ...
main.o : main.cpp
$(CC) ...
%.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)
$(SRC)
所有.cpp
文件上的$(CC)
$(SRC)
。”
這樣做比較好,但是仍然存在問題:更新后的規則始終會編譯您的所有.cpp
文件,即使是最新的文件。 要解決此問題,規則的命令部分需要將正確的.cpp
文件重新編譯為正確的.o
文件。 您可以使用自動變量(例如$<
(第一個必備條件)和$@
(目標))來執行此操作:
%.o: %.cpp
$(CC) -c $< -o $@
GNU Make手冊有更多的解釋和細節。
您使用main.cpp的規則-main.o-未指定main.o依賴的任何內容。 您至少需要將該行作為“ main.o:main.cpp”,以及main.o依賴的任何其他源文件。
我看到您有一個使用makedepend的依賴規則; 您使用正確嗎? 我自己還沒有使用過它,但是我總是以以下內容結束我的makefile:
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
#
然后,當我運行“ makedepend”時,我得到如下代碼:
main.o: main.c main.h otherstuff.h
otherstuff.o: otherstuff.c otherstuff.h
在調試打開的情況下運行make,然后查看得到的結果。
Make是一個非常古老的代碼,可以肯定它正在按照自己想要的方式工作。
您使用find查找.o文件的事實使我認為您在真實的東西中具有子目錄。 如果是這樣,則需要確保Make可以看到它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.