生成文件符號$ @和$ <是什麼意思?

CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

$@$<到底作什麼? html


#1樓

$@$<稱爲自動變量 。 變量$@表明已建立文件的名稱(即目標),而$<表明建立輸出文件所需的第一個先決條件。
例如: 數據庫

hello.o: hello.c hello.h
         gcc -c $< -o $@

在這裏, hello.o是輸出文件。 這就是$@擴展到的內容。 第一個依賴項是hello.c 。 這就是$<擴展到的內容。 函數

-c標誌生成.o文件; 有關詳細說明,請參見man gcc-o指定要建立的輸出文件。 spa

有關更多詳細信息,您能夠閱讀有關Linux Makefiles的文章調試

另外,您能夠查看GNU make手冊 。 這將使製做文件和調試它們變得更加容易。 code

若是運行此命令,它將輸出makefile數據庫: htm

make -p

#2樓

$@是要生成的文件的名稱, $<是第一個前提條件(一般是源文件)。 您能夠在GNU Make手冊中找到全部這些特殊變量的列表。 對象

例如,考慮如下聲明: get

all: library.cpp main.cpp

在這種狀況下: 編譯器

  • $@all求值
  • $<評估爲library.cpp
  • $^評估爲library.cpp main.cpp

#3樓

$@$<是特殊宏。

哪裏:

$@是目標的文件名。

$<是第一個依賴項的名稱。


#4樓

使用GNU Make,第3版管理項目 (受GNU Free Documentation License許可 ):

匹配規則後,由make設置自動變量 。 它們提供對目標和先決條件列表中元素的訪問,所以您沒必要顯式指定任何文件名。 它們對於避免代碼重複很是有用,可是在定義更通用的模式規則時相當重要。

有七個「核心」自動變量:

  • $@ :表明目標的文件名。

  • $% :歸檔成員規範的文件名元素。

  • $< :第一個必備條件的文件名。

  • $? :比目標更新的全部先決條件的名稱,用空格分隔。

  • $^ :全部必備組件的文件名,以空格分隔。 此列表已刪除重複的文件名,由於對於大多數用途(例如編譯,複製等),不須要重複的文件名。

  • $+ :相似於$^ ,這是用空格分隔的全部必備組件的名稱,除了$+包含重複項。 該變量是爲特定狀況建立的,例如連接器的參數,其中重複的值具備含義。

  • $* :目標文件名的主幹。 詞幹一般是沒有後綴的文件名。 不建議在模式規則以外使用它。

此外,上述每一個變量都有兩個變體,以便與其餘品牌兼容。 一個變體僅返回值的目錄部分。 這是經過在符號$(@D)$(<D)等後面附加一個「 D」來表示的。另外一個變體僅返回值的文件部分。 這經過在符號$(@F)$(<F)等後面附加一個「 F」來表示。請注意,這些變體名稱的長度超過一個字符,所以必須用括號括起來。 GNU make經過dir和notdir函數提供了更具可讀性的替代方法。


#5樓

若是main.cpphello.cppfactorial.cpp任何一個更改,Makefile都會生成hello可執行文件。 實現該規範的最小可能的Makefile多是:

hello: main.cpp hello.cpp factorial.cpp
    g++ -o hello main.cpp hello.cpp factorial.cpp
  • 親:很容易讀
  • 缺點:維護的噩夢,C ++依賴項的重複
  • 缺點:效率問題,即便只更改了一個,咱們也從新編譯了全部C ++

爲了改進上述內容,咱們僅編譯那些已編輯的C ++文件。 而後,咱們僅將結果對象文件連接在一塊兒。

OBJECTS=main.o hello.o factorial.o

hello: $(OBJECTS)
    g++ -o hello $(OBJECTS)

main.o: main.cpp
    g++ -c main.cpp

hello.o: hello.cpp
    g++ -c hello.cpp

factorial.o: factorial.cpp
    g++ -c factorial.cpp
  • 專家:修復效率問題
  • 缺點:新的維護噩夢,目標文件規則可能出現錯字

爲了對此進行改進,咱們能夠用一個.cpp.o規則替換全部目標文件規則:

OBJECTS=main.o hello.o factorial.o

hello: $(OBJECTS)
    g++ -o hello $(OBJECTS)

.cpp.o:
    g++ -c $< -o $@
  • 優勢:返回簡短的makefile,有點容易閱讀

在這裏, .cpp.o規則定義如何創建anyfile.oanyfile.cpp

  • $<匹配第一個依賴項,在這種狀況下爲anyfile.cpp
  • $@匹配目標,在這種狀況下爲anyfile.o

Makefile中存在的其餘更改是:

  • 使將編譯器從g ++更改成任何C ++編譯器變得更加容易。
  • 使更改編譯器選項更加容易。
  • 使更改連接器選項更加容易。
  • 使更改C ++源文件和輸出變得更加容易。
  • 添加了默認規則「所有」,該規則能夠快速檢查以確保在嘗試構建應用程序以前全部源文件都存在。
相關文章
相關標籤/搜索