[英]gcc - What does ../ (dot dot slash) mean in a variable in a Makefile?
我已經搜尋了數小時來尋找答案。 我是gcc和Makefile的新手。
我在一些看起來像這樣的源代碼中有一個Makefile:
CC=gcc
SRCDIR=src
BINDIR=../bin
CFLAGS= -flag
LIBS= -lthing
...
$(BINDIR)/program_name: $(SRCDIR)/program_name.c
$(CC) $(CFLAGS) $(SRCDIR)/program_name.c -o $(BINDIR)/program_name $(LIBS)
我理解所有這些意味着什么,除了BINDIR
../意味着要做什么。 制作Makefile時,出現錯誤消息:
/usr/bin/ld: cannot open output file ../bin/program_name: No such file or directory
collect2: error: ld returned 1 exit status
Makefile:20: recipe for target '../bin/program_name' failed
make: *** [../bin/program_name] Error 1
我的猜測是該Makefile的原始作者意味着bin文件夾應該放在Makefile所在的父目錄中。 我知道在使用Linux CLI命令cd
,點號表示進入目錄。 這是要達到的目的嗎?
您的makefile缺少創建BINDIR
目錄的規則-如果該目錄不存在,則您的鏈接行將無法在其中放置生成的二進制文件! 像這樣的規則應該做到這一點:
$(BINDIR):
mkdir -p $(BINDIR)
只要確保其他任何規則(例如您的問題中的一個)也依賴於此目錄!
要在實際需要$(BINDIR)
目錄之前自動創建該目錄,必須將其聲明為使用該目錄的任何目標的先決條件(依賴項)。 但是,每次其內容更改時,其時間戳也會更改。 因此,將其聲明為常規先決條件不是最好的選擇,因為依賴於它的目標將在沒有真正原因的情況下重新構建,僅因為$(BINDIR)
的內容已更改。
這就是為什么make還支持僅訂購的先決條件 (OOP):
$(BINDIR)/program_name: $(SRCDIR)/program_name.c | $(BINDIR)
$(CC) $(CFLAGS) $< -o $@ $(LIBS)
$(BINDIR):
mkdir -p $@
注意|
介紹OOP列表。 如果不存在,則會構建一個OOP,這也會導致依賴於它的目標也被(重新構建)。 但是,如果存在,make甚至不會考慮其最后修改時間。 即使某些依賴它的目標較舊,也不能因此而重建它。
注意:我還使用了$<
和$@
自動變量 。 在規則的配方中,它們分別擴展為第一個先決條件( $(SRCDIR)/program_name.c
)和目標( $(BINDIR)/program_name
)。 強烈建議使用它們:更少的輸入,更少的錯誤,更通用的規則...它們具有許多良好的屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.