簡體   English   中英

Makefile無法構建程序的更新部分-C ++

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

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