[英]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
什么都不做。 將目標重命名為其他內容並重試。
adjl
和adjm
目標是真正的目標。 由於它們沒有依賴關系,並且存在文件(列表中的2個目錄),因此make不會執行任何操作(因為它們存在)。
但是,您想要的是將adjl
和adjm
指定為偽目標(以便在指定命令時執行這些命令)。 為此,
.PHONY: adjl adjm
有關更多信息,請閱讀http://www.gnu.org/software/automake/manual/make/Phony-Targets.html 。
編輯
事實上, real_clean
和clean
規則也應該是虛假的。
您的目錄與目標同名。
由於您的目標不依賴於任何東西,因此它們始終被視為最新。
指定未鏈接到磁盤上文件的目標時,需要使用特殊目標.PHONY
:
.PHONY: adjl adjm
您也應該為clean和real_clean目標執行相同操作 - 否則如果有人創建名為“clean”的文件,它們將會中斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.