[英]Makefile, Why is it recompiled every time?
我的目錄結構是: objFile/(cacheOp.o,fileOp.o)
, Header/(cacheOp.h,fileOp.h)
, Bodyer/(cacheOp.cpp,fileOp.cpp)
我寫了一個Makefile文件:
cc=g++
CXXFLAGS=-g -o0
libObjs = objFile/cacheOp.o objFile/fileOp.o
all : cacheOpObj testFunc.cpp fileOpObj
$(cc) testFunc.cpp objFile/cacheOp.o -o test $(CXXFLAGS)
cacheOpObj : Header/cacheOp.h Bodyer/cacheOp.cpp
$(cc) -c Bodyer/cacheOp.cpp -o objFile/cacheOp.o $(CXXFLAGS)
fileOpObj : Header/fileOp.h Bodyer/fileOp.cpp
$(cc) -c Bodyer/fileOp.cpp -o objFile/fileOp.o $(CXXFLAGS)
但結果並不如預期。
make
命令時,即使我不做任何更改,它也會執行g++ -c Bodyer/cacheOp.cpp -o objFile/cacheOp.o
g++ -c Bodyer/fileOp.cpp -o objFile/fileOp.o
g++ testFunc.cpp objFile/cacheOp.o -o test
。 如果文件沒變,不是應該顯示是最新的嗎? 我將依賴項命名為 label。你在撒謊,看看這個規則/食譜:
cacheOpObj : Header/cacheOp.h Bodyer/cacheOp.cpp
$(cc) -c Bodyer/cacheOp.cpp -o objFile/cacheOp.o $(CXXFLAGS)
這意味着“如果cacheOpObj
丟失或早於Header/cacheOp.h
或Bodyer/cacheOp.cpp
,則此命令將生成它”。 除非它沒有,否則它會創建一個名為objFile/cacheOp.o
的文件。 所以 Make 每次都會重新運行配方。
您的 CXXFLAGS 中也有一個拼寫錯誤( -o0
而不是-O0
),您應該修復它。 (無論如何-Og
是更好的默認值)
這是您的 makefile 的清理版本:
CXXFLAGS=-g -Og
libObjs=objFile/cacheOp.o objFile/fileOp.o
all: test
test: testFunc.cpp $(libObjs)
$(CXX) $^ -o $@ $(CXXFLAGS)
objFile/cacheOp.o: Bodyer/cacheOp.cpp Header/cacheOp.h
$(CXX) -c $< -o $@ $(CXXFLAGS)
objFile/fileOp.o: Bodyer/fileOp.cpp Header/fileOp.h
$(CXX) -c $< -o $@ $(CXXFLAGS)
注意使用$<
(第一個輸入)、 $^
(所有輸入)、 $@
(輸出)等自動變量來縮短配方。
如果您是 make 初學者,您應該避免使用非真實文件的目標。 在您的情況下,當您鍵入make
時,make 會嘗試構建第一個目標: all
。 由於沒有這樣的文件,它知道必須執行配方才能創建名為all
的文件。 但在執行這個秘訣之前,它會查看先決條件( cacheOpObj
、 testFunc.cpp
、 fileOpObj
)。 第一個和第三個都不存在,因此請嘗試構建它們。
將所有這些替換為:
test: objFile/cacheOp.o testFunc.cpp objFile/fileOp.o
$(cc) testFunc.cpp objFile/cacheOp.o -o test $(CXXFLAGS)
objFile/cacheOp.o: Header/cacheOp.h Bodyer/cacheOp.cpp
$(cc) -c Bodyer/cacheOp.cpp -o objFile/cacheOp.o $(CXXFLAGS)
objFile/fileOp.o: Header/fileOp.h Bodyer/fileOp.cpp
$(cc) -c Bodyer/fileOp.cpp -o objFile/fileOp.o $(CXXFLAGS)
看,所有目標和先決條件都是真實文件。 Make 可以檢查它們的存在和最后修改時間來決定做什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.