簡體   English   中英

Makefile始終認為項目是最新的 - 但文件甚至不存在

[英]Makefile always thinks project is up to date - but files don't even exist

我有以下makefile:

CCC = g++
CCFLAGS = -ansi

driver: driver.o graph.o
        $(CCC) -o driver driver.o graph.o

graph.o: graph.h
driver.o: graph.h

adjl:
        rm -f graph.h graph.cc
        ln -s adjl/graph.cc .
        ln -s adjl/graph.h .
        touch graph.cc graph.h
adjm:
        rm -f graph.h graph.cc
        ln -s adjm/graph.cc .
        ln -s adjm/graph.h .
        touch graph.cc graph.h

clean:
        rm -f *.o
real_clean: clean
        rm -f graph.cc graph.h
        rm -f driver

我的想法是,我試圖鏈接兩個不同的.cc / .h文件,具體取決於我想要使用的實現。 如果我make_clean,沒有.cc / .h文件存在,我只有一個driver.cc文件和文件夾中的makefile。 如果我打電話給make,它說它們是最新的。 即使我在adjl / adjm中編輯文件以使它們成為“更新”版本,也會發生這種情況。

[95]% ls
adjl/  adjm/  driver.cc  makefile
 [96]% make adjl
make: `adjl' is up to date.
 [97]% make adjm
make: `adjm' is up to date.

我從我做過的另一個項目中獲取了模板makefile,並且它們以相同的方式編寫,但我可以重復生成相同的命令而沒有“最新”問題。

我用谷歌搜索但沒有發現類似於我的問題(他們通常似乎涉及在制作之前沒有清潔的用戶)。

感謝任何人閱讀。

問題是您的目錄名稱與Makefile中的目標相同。

當你發出make adjl make檢查它找到的文件adjl什么都不做。 將目標重命名為其他內容並重試。

adjladjm目標是真正的目標。 由於它們沒有依賴關系,並且存在文件(列表中的2個目錄),因此make不會執行任何操作(因為它們存在)。

但是,您想要的是將adjladjm指定為偽目標(以便在指定命令時執行這些命令)。 為此,

.PHONY: adjl adjm

有關更多信息,請閱讀http://www.gnu.org/software/automake/manual/make/Phony-Targets.html

編輯

事實上, real_cleanclean規則也應該是虛假的。

您的目錄與目標同名。

由於您的目標不依賴於任何東西,因此它們始終被視為最新。

指定未鏈接到磁盤上文件的目標時,需要使用特殊目標.PHONY

.PHONY: adjl adjm

您也應該為clean和real_clean目標執行相同操作 - 否則如果有人創建名為“clean”的文件,它們將會中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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