makefile學習記錄

2021-07-11 05:03:13 字數 1968 閱讀 6921

一.環境變數makefiles和include的區別

1.環境變數makefiles所制定的makefile檔案中的"目標"不會被作為make執行的終極"目標".

2.環境變數所定義的檔案列表是否存在不會導致make錯誤,也不退出

3.在執行make時,首先讀取的是環境變數makefiles所指定的檔案列表,之後才是工作目錄下的makefile.

二.自動環境變數$?

1.$?表示依賴檔案列表中被改變的所有檔案

三.萬用字元的缺陷

1.萬用字元包括"*" "?" "[...]",與bash用法和含義完全相同

2.makefile中萬用字元用在規則的目標,依賴,命令中.除此之外,不能使用萬用字元.只能用函式(如wildcard)代替.

四.目錄搜尋(對工作目錄的搜尋永遠處於最優先地位)

1.環境變數vpath,指定依賴檔案的搜尋路徑.定義vpath時,使用空格或者:講多個目錄隔開

2.關鍵字vpath,為不同型別的檔案(由檔名區分)指定不同的搜尋目錄.

1.vpath pattern dir

所有符合模式pattern的檔案指定搜尋目錄dir,多個目錄使用空格或者:隔開

vpath %.h ../header     #表示在makefile中出現的.h檔案,如果當前目錄下找不到,則到../header目錄下尋找

2.vpath pattern

清除之前為符合模式pattern的檔案設定的搜尋路徑

3.vpath

清除所有已被設定的檔案搜尋路徑

五.bash#... 的含義

例子: sh hello.sh a b

$# 是傳給指令碼的引數個數    2

$0 是指令碼本身的名字    hello.sh

$1 是傳遞給該shell指令碼的第乙個引數    a

$2 是傳遞給該shell指令碼的的第二個引數    b

$@ 是傳給指令碼的所有引數列表    "a" "b" #可以做for ... in..

$* 是以乙個單字串顯示所有向指令碼傳遞的引數    "a b"

$$ 是指令碼執行的當前程序id號

$? 是顯示最後命令的退出狀態,0表示沒錯誤,其他值表示有錯誤.

六.makefile 裡3個非常變數

$@ 目標檔案

$^ 所有依賴的檔案

$< 第乙個依賴檔案

七.庫檔案

在編譯選項按照 -lname 規則

manke在執行規則時會在當前目錄下搜尋乙個名字為libname.so的檔案,

如果當前目錄不存在這樣的檔案,則make會繼續按照vpath和vpath指定目錄搜尋

如果還是不存在,make將搜尋系統庫檔案預設目錄,順序是/lib   /usr/lib   prefix/lib(在linux中為/usr/local/lib,其他系統可能不同)

如果libname.so還是找不到,則make會按照上述順序查詢名字為libname.a的檔案

如新增libdvbstatck.so時,應該是-ldvbstack

八.偽目標

當時用make命令指定此目標時,這個目標所在規則定義的命令.無論目標檔案是否存在都會被無條件執行 .

作用:1.偽目標,不代表乙個真正的檔名,在執行make時可以指定這個目標來執行其所在規則定義的命令.有時也可將偽目標作為乙個標籤.

2.用在make的並行和遞迴執行中.

subdirs= foo bar hee

subdirs:

for dir in $(subdirs);do \

$(make) -c $$dir;\

done

3.當偽目標作為偽目標的依賴時,則相當於子程式,是每次都要執行的

九.如果乙個規則沒有命令 或者 依賴,並且他的目標不是乙個存在的檔名.在執行次規則時,目標總會被認為是最新的.

十.makefile的特殊目標

.phony  他的所有依賴都被當做偽目標

.suffixes 的所有依賴指出了

Makefile學習記錄(三)

1.在專案編譯中想將幾個靜態庫合併成乙個靜態庫 嘗試 ar crv a.a b.a c.a 然後使用 gcc o test la ld 報錯找不到b.a中包含的函式 需要先將靜態庫解壓後在合併 ar x a.a ar x b.a ar x c.a ar crv a.a o ar這個壓縮指令可以理解為...

makefile 語法記錄

是最基本的賦值 是覆蓋之前的值 是如果沒有被賦值過就賦予等號後面的值 是新增等號後面的值 c.o 這句話的意思就是 o c 也就是說,所有的.o檔案,依賴於對應的.c檔案.c.o 字尾規則。它告訴make 後面的命令 使用從.c檔案生成.o 目標檔案除去字尾的部分,如果目標是xx.o,那麼 xx 依...

Makefile編寫記錄

近期學習 linux 需要使用 makefile,網上蒐羅了很多這方面的資料,所裡在這裡做乙個整理。1 靜態模式 看乙個例子 objects foo.o bar.o all objects objects o c cc c cflags o 上面的例子中,指明了我們的目標從 object 中獲取,o...