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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Makefile文件语法规则及用法总结

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Makefile文件语法规则及用法总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Makefile的作用

Makefile文件實質上就是一個工程代碼編譯腳本,一旦寫好,只需要一個make命令,整個工程就會自動按照腳本的規定方式編譯,極大的提高了軟件開發的效率。

? ? ?make是系統指令,它是根據自己的配置文件,可以進行工程管理的指令。文件放在目錄,要編譯哪個目錄的文件,要鏈接哪個目錄的文件....
?? ?
?? ?makefile是make指令對應的一個配置,當輸入make回車時,執行makefile里面的所有配置指令,一一執行。
?? ?makefile的組成:makefile的語法+shell指令。(任何linux里面用到的shell指令都可以加入進去)

二、make 命令使用

三、makefile的編寫規則
?? ?基本語法如下:
?? ?目標文件:依賴文件
?? ?(tab)執行指令集合
?? ?工作原理:(修改時間比較的原理)
?? ??? ?1.識別目標文件,去找到他的依賴文件(如果找得到)
?? ??? ?2.執行情況
?? ??? ??? ?(1)如果發現目標文件不存在,同時依賴文件存在,就會執行指令集合。
?? ??? ??? ?(2)如果發現目標文件已經存在了,同時依賴問價存在,make指令會自動去比較兩者的修改時間
?? ??? ??? ??? ??? ?修改時間:依賴文件 > 目標文件,就會執行指令集合。
?? ??? ??? ??? ??? ?修改時間:依賴文件 <= 目標文件,就不會執行指令集合。同時會提示目標文件已經是最新的
? ? ?
?? ??? ?注意點:makefile之后從第一個規則體的依賴文件去操作,只會操作出現的依賴文件.? ?
?? ??? ?最常用的規則:(多個.c生成一個可執行文件)
?? ??? ?目標文件(最終目標):依賴文件(n個)
?? ??? ??? ?執行指令
?? ??? ?目標文件(依賴文件(n個)):依賴文件
?? ??? ??? ?執行指令

四、偽指令

? ? ? ? all? 跟? make+目標文件
?? ??? ?all表示最終目標,后來的依賴文件就可以寫可執行文件,不需要寫指令。
?? ??? ?如果在all后面的依賴文件沒有出現clean,但是你寫了clean。那么makefile是不會自動執行clean,只有當單獨輸入make clean時,才會獨立執行clean執行指令。
? ? ? ? 在許多Makefile中都可以看到.PHONY:xxx之類的語句,其含義就是定義xxx為偽目標,當一個目標被聲明為偽目標后,make在執行規則時不會去試圖去查找隱含規則來創建它。

? ? ? ???可近似的理解為編譯可選項:等用戶想操作的時候才執行,用戶不操作,不會自動執行。

參考博客:?https://www.cnblogs.com/samuelwnb/p/3895191.html

五、makefile中的變量
?? ??? ?實際上變量只能存儲字符串。
?? ??? ?定義:變量名 = “字符串”
?? ??? ?使用:$(變量名)
?? ??? ?賦值方式:
?? ??? ??? ?直接對變量本身進行操作
?? ??? ??? ? =?? ?遞歸展開賦值,當對一個變量進行操作時,如果這個變量后后面有變化,這個變量不會馬上賦值,會一直找到最后一次變量,再進行賦值。
?? ??? ??? ?:=?? ?就地展開賦值,當對一個變量進行操作,直接使用這個變量當前的值,而不受后面任何變量。
?? ??? ??? ?
?? ??? ??? ?在變量的基礎上加上東西
?? ??? ??? ?+=?? ?對某個變量的值,進行追加
?? ??? ??? ??=?? ?如果變量沒有初始化,則對其初始化

六、自動變量
?? ?所有自動變量,自己本身存在的特定的作用。
?? ?$*?? ?不包含拓展名的目標文件名稱。
?? ?$+?? ?所有的依賴文件名稱,但是可能出現同名的。
?? ?$^?? ?所有的依賴文件名稱,但是不會出現同名的。
?? ?$< ?第一個依賴文件的名稱。
?? ?$@?? ?目標文件的完整名稱
?? ?$??? ?所有已經更新的依賴文件的名字。(比目標文件要新的依賴文件)
?? ??? ?
?? ?模式規則:(%),只要在文件中,出現%符號,那就代表是模式規則。等效于shell指令的*通配符。
?? ?自動根據目標文件,去配對對應的依賴文件。自動順序的配對

七、makefile的函數
?? ?makefile內部是允許自定義函數/使用函數。
?? ?函數的用法:
?? ??? ?$(函數名 函數參數列表)
?? ??? ?wildcard:文件名展開函數。將所有用戶想要找到的文件名給得到(用戶想要得到的文件名可以通過通配符)。
?? ??? ?用法:$(wildcard 可變參數列表)?
?? ??? ??? ??? ?返回值:已經找到的文件名列表,每個文件名都加上空格。
?? ??? ?$(wildcard *.c)
?? ??? ?
?? ??? ?patsubst:替換字符串輸出。按照用戶指定的替換方式,對相應的字符串進行替換。
?? ??? ?用法:$(patsubst <form>,<to>,<text>)
?? ??? ??? ??? ?test:要進行替換的原始數據,字符串123s1df32asf5 ?123%
?? ??? ??? ??? ?根據form里面格式的定義,替換稱為to里面的格式。
?? ??? ??? ? $(patsubst %.c,%.o,"1.c 2.c ")

八、通用Makefile框架,適用于一般中小型項目

TARGET := ../bin/main CC := gccINCLUDE:= -I ../includeLIBS:= -lpthreadCSRCS := $(wildcard *.c) OBJS := $(patsubst %.c, %.o, $(CSRCS))$(TARGET): $(OBJS) $(CC) $+ -o $@ $(LIBS) %.o:%.c$(CC) -c -g $< -o $@ $(INCLUDE)clean:rm -rf $(OBJS) $(TARGET)#rm *.o

九、庫依賴順序

當一個工程鏈接的庫較多時,很多時候因為庫之間的依賴問題導致一直編譯不過。此時要捋清庫之間的依賴關系,然后按依賴順序(越底層的庫越往后放)鏈接即可。

順序應該如下:

LIBS :=? -l(應用層lib) -l(基礎lib) -l(系統lib)

查看庫依賴關系的命令有為:

# readelf -d [庫名]

# ldd [庫名]

十、Makefile調用shell命令

Makefile腳本中,是可以直接調用shell命令的,并且在執行make時,能看到執行的shell語句。

在shell命令前添加:'@' 符號, 則可以不顯示命令本身而只顯示結果。

在shell命令前添加: '-'? 符號,則運行該條shell命令失敗時,不會中斷Makefile腳本的后續執行。

總結

以上是生活随笔為你收集整理的Makefile文件语法规则及用法总结的全部內容,希望文章能夠幫你解決所遇到的問題。

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