makefile中一些符號的含義


關於gnu make的詳細介紹參看http://www.gnu.org/software/make/manual/make.html
 
規則
讓我們先來粗略地看一看Makefile的規則。
target ... : prerequisites ...
command
...
...
目標:依賴
執行指令 ...
target也就是一個目標文件,可以是Object File,也可以是執行文件。還可以是一個標簽(Label)。
① prerequisites就是,要生成那個target所需要的文件或是目標。
② command也就是make需要執行的命令。(任意的Shell命令)
這是一個文件的依賴關系,也就是說,target這一個或多個的目標文件依賴於prerequisites中的文件,其生成規則定義在command中。說白一點就是說,prerequisites中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執行(command一定要以Tab鍵開始,否則 編譯器無法識別command),減少重復編譯,提高了其軟件工程管理效率。
 
部分符號:

$@
表示規則中的目標文件集。在模式規則中,如果有多個目標,那么,"$@"就是匹配於目標中模式定義的集合。
$%
僅當目標是函數庫文件中,表示規則中的目標成員名。例如,如果一個目標是"foo.a (bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目標不是函數庫文件(Unix下是[.a],Windows下是 [.lib]),那么,其值為空。
$<
依賴目標中的第一個目標名字。如果依賴目標是以模式(即"%")定義的,那么"$<"將是符合模式的一系列的文件集。注意,其是一個一個取出來的。
$?
所有比目標新的依賴目標的集合。以空格分隔。
$^
所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重復的,那個這個變量會去除重復的依賴目標,只保留一份。
$+
這個變量很像"$^",也是所有依賴目標的集合。只是它不去除重復的依賴目標。
$*
這個變量表示目標模式中"%"及其之前的部分。如果目標是"dir/a.foo.b",並且目標的模式是"a.%.b",那么,"$*"的值就是"dir /a.foo"。這個變量對於構造有關聯的文件名是比較有較。如果目標中沒有模式的定義,那么"$*"也就不能被推導出,但是,如果目標文件的后綴是 make所識別的,那么"$*"就是除了后綴的那一部分。例如:如果目標是"foo.c",因為".c"是make所能識別的后綴名,所以,"$*"的值 就是"foo"。這個特性是GNU make的,很有可能不兼容於其它版本的make,所以,你應該盡量避免使用"$*",除非是在隱含規則或是靜態模式中。如果目標中的后綴是make所不 能識別的,那么"$*"就是空值。

 

下面語句分析:

makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$(@F)代表的不同含義

$(filter-out $(PHONY) $(wildcard $^),$^)
常用用法為$(wildcard *.c)
表示列舉當前目錄下的所有.c文件
這里$^因為會包含依賴的文件名,如果包含的該文件存在,那么將返回其含路徑的文件名
所以$(wildcard $^)就是用來過濾$^包含的所有文件並且該文件確實在本地存在.

自動化變量$?代表依賴文件列表中被改變過的所有文件。
自動化變量$^代表所有通過目錄搜索得到的依賴文件的完整路徑名(目錄 + 一般文件名)列表。
自動化變量$@代表規則的目標。
自動化變量$<代表規則中通過目錄搜索得到的依賴文件列表的第一個依賴文件。
自動化變量$(@D)
The directory part of the file name of the target,
with the trailing slash removed. If the value of ‘$@’ is dir/foo.o
then ‘$(@D)’ is dir. This value is . if ‘$@’ does not contain a slash.
http://www.gnu.org/software/make/manual/make.html
自動化變量$(@F)
The file-within-directory part of the file name of
the target. If the value of ‘$@’ is dir/foo.o then ‘$(@F)’ is foo.o.
‘$(@F)’ is equivalent to ‘$(notdir $@)’.

 

-----------------------------------------------

AR
歸檔維護程序的名稱,默認值為 ar。
ARFLAGS
歸檔維護程序的選項。
AS
匯編程序的名稱,默認值為 as。
ASFLAGS
匯編程序的選項。
CC
C 編譯器的名稱,默認值為 cc。
CFLAGS
C編譯器的選項。
CPP
C 預編譯器的名稱,默認值為 $(CC) -E。
CPPFLAGS
C 預編譯的選項。
CXX
C++編譯器的名稱,默認值為 g++。
CXXFLAGS
C++ 編譯器的選項。
FC
FORTRAN編譯器的名稱,默認值為 f77。
FFLAGS
FORTRAN編譯器的選項。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM