簡體   English   中英

gcc-../(點斜杠)在Makefile中的變量中是什么意思?

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

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