日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《跟我一起写Makefile》读书笔记(3)

發布時間:2023/12/20 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《跟我一起写Makefile》读书笔记(3) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一個Makefile例子



五、書寫規則

一般來說,定義在 Makefile 中的目標可能會有很多,但是第一條規則中的目標將被確立為最終的目標。

1、規則的語法


(1)如果命令太長,你可以使用反斜框(‘\’)作為換行符。make 對一行上有多少個字符沒有限制。

(2)一般來說,make 會以 UNIX 的標準 Shell,也就是/bin/sh 來執行命令。


2、在規則中使用通配符

(1)make支持三各通配符: “*”,“?”,“[...]”;

(2)objects = *.o?,這里objects的值就是“*.o”?,并不會展開。

如果想讓 objects 的值是所有[.o]的文件名的集合,那么需要寫成objects := $(wildcard *.o)?。


3、文件搜索

(1)在哪里尋找依賴的文件?

(2)Makefile 文件中的特殊變量“VPATH”就是完成這個功能的。

  • 如果沒有指明這個變量,make 只會在當前的目錄中去找尋依賴文件和目標文件。
  • 如果定義了這個變量,那么make就會在當當前目錄找不到的情況下,到所指定的目錄中去找尋文件。
  • VPATH = src:../headers, 指定兩個目錄,“src”和“../headers”,make 會按照這個順序進行搜索。目錄由“冒號”分隔。(當然,當前目錄永遠是最高優先搜索的地方)
(3)另一個設置文件搜索路徑的方法是使用 make 的“vpath”關鍵字
  • vpath %.h ../headers,該語句表示,要求 make 在“../headers”目錄下搜索所有以“.h”結尾的文件。(如果某文件在當前目錄沒有找到的話)

4、多目標

我們的可以使用一個自動化變量“$@”,這個變量表示著目前規則中所有的目標的集合

如下面的例子:

5、靜態模式

(1)語法 <targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
....

目標集合:目標集合的模式:依賴集合的模式

(2)如果<target-parrtern>定義成“%.o”
  • 意思是我們的<target>集合中都是以“.o”結尾的;
(3)如果<prereq-parrterns>定義成“%.c”?
  • 意思是對<target-parrtern>所形成的目標集進行二次定義;
  • 即,取<target-parrtern>模式中的“%”(也就是去掉了[.o]這個結尾),并為其加上[.c]這個結尾,形成的新集合。
(4)例子示范
例子1

例子2

六、書寫命令

1、顯示命令

(1)通常,make把它要執行的命令行,在命令執行前輸出到屏幕上。但如果我們用“@”字符在命令行前,那么這個命令將不被 make 顯示出來,但命令還是被運行的。(這叫靜默執行)

(2)如果 make 執行時,帶入 make 參數“-n”或“--just-print”,那么其只是顯示命令,但不會執行命令

  • 這個功能很有利于我們調試我們的 Makefile,看看我們書寫的命令執行起來是什么樣子的或是什么順序的。
(3)輸入make -s或make --slient時,則是全面禁止命令的顯示(但是命令仍然被執行)。

2、命令錯處處理

(1)每當命令運行完后,make 會檢測每個命令的返回碼,如果命令返回成功,那么 make 會執行下一條命令。
  • 如果一個規則中的某個命令出錯了(命令退出碼非零),那么 make 就會終止執行當前規則,這將有可能終止所有規則的執行。
(2)可以在 Makefile 的命令行前加一個減號“-”(在 Tab 鍵之后),標記為不管命令出不出錯都認為是成功的。

如:

clean:

-rm -f *.o

(3)給 make 加上“-i”或是“ --ignore-errors”參數,那么,Makefile 中所有命令都會忽略錯誤?。

(4)make 的參數的是“-k”或是“--keep-going”,這個參數的意思是,如果某規則中的命令出錯了,那么就終止該規則的執行,但繼續執行其它規則。


3、嵌套執行make

(1)總控 Makefile 的變量可以傳遞到下級的 Makefile 中(如果你顯示的聲明),但是不會覆蓋下層的 Makefile 中所定義的變量,除非指定了“-e”參數

(2)一些細節

  • 如果你要傳遞變量到下級 Makefile 中,那么你可以使用這樣的聲明:export <variable ...>;
  • 如果你不想讓某些變量傳遞到下級 Makefile 中,那么你可以這樣聲明:unexport <variable ...>?;
  • 如果你要傳遞所有的變量,那么,只要一個 export 就行了,后面什么也不用跟,表示傳遞所有的變量;
  • 有兩個變量,一個是 SHELL,一個是 MAKEFLAGS,這兩個變量不管你是否 export,其總是要傳遞到下層 Makefile 中,特別是 MAKEFILES 變量,其中包含了 make的參數信息,如果我們執行“總控 Makefile”時有 make 參數或是在上層 Makefile 中定義了這個變量,那么 MAKEFILES 變量將會是這些參數,并會傳遞到下層 Makefile 中,這是一個系統級的環境變量。


4、定義命令包


七、使用變量

  • 變量是大小寫敏感的, “foo”、 “Foo”和“FOO”是三個不同的變量名;
  • 變量的命名字可以包含字符、數字,下劃線(可以是數字開頭);
  • 在 Makefile 中的定義的變量,就像是 C/C++語言中的宏一樣,他代表了一個文本字串,在 Makefile 中執行的時候其會自動原模原樣地展開在所使用的地方。其與 C/C++所不同的是(字符串常量不能修改?),你可以在 Makefile 中改變其值。

1、變量的基礎

類似shell中變量的定義和使用方法,需要用$來使用,強烈建議使用()或者{ }將變量包起來使用。



2、變量中的變量

在 Makefile 中有兩種方式來在用變量定義變量的值

(1)簡單的使用“=”號

  • 在“=”左側是變量,右側是變量的值;
  • 右側變量的值可以定義在文件的任何一處,也就是說,右側中的變量不一定非要是已定義好的值,也可以使用后面定義的值。


(2)使用“:=”操作符
  • 前面的變量不能使用后面的變量,只能使用前面已定義好了的變量。


(3)使用“?=”操作符
  • 如果前面已經定義,則本句什么也不做,跳過

(4)使用“+=”操作符
  • 接續賦值













總結

以上是生活随笔為你收集整理的《跟我一起写Makefile》读书笔记(3)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。