簡體   English   中英

Makefile,為什么每次都重新編譯?

[英]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)

但結果並不如預期。

  1. 當我執行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.hBodyer/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的文件。 但在執行這個秘訣之前,它會查看先決條件( cacheOpObjtestFunc.cppfileOpObj )。 第一個和第三個都不存在,因此請嘗試構建它們。

將所有這些替換為:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM