日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 糖果Autosar
[導(dǎo)讀]一初識Makefilemake是一種用于項(xiàng)目編譯的應(yīng)用程序,本質(zhì)是一種腳本。而Makefile則是對make腳本的規(guī)則描述。僅僅是寫腳本編譯項(xiàng)目的話shell腳本也是可以做的,用make的原因在于,make可以解析源文件之間的依賴,根據(jù)依賴關(guān)系自動維護(hù)編譯工作。執(zhí)行宿主操作系統(tǒng)中...


一 初識Makefile

make是一種用于項(xiàng)目編譯的應(yīng)用程序,本質(zhì)是一種腳本。而Makefile則是對make腳本的規(guī)則描述。
僅僅是寫腳本編譯項(xiàng)目的話shell腳本也是可以做的,用make的原因在于,make可以解析源文件之間的依賴,根據(jù)依賴關(guān)系自動維護(hù)編譯工作。執(zhí)行宿主操作系統(tǒng)中的各種命令。
Makefile是一個(gè)描述文件,定義一系列的規(guī)則來指定源文件之間的調(diào)用先后順序。有自己特定的語法規(guī)則,可以定義函數(shù)及函數(shù)調(diào)用。可以集成各種系統(tǒng)命令。Makefile用于指導(dǎo)make程序如何完成工作。


Makefile示例:


sayhello:
echo "hello world!"
  • 1


  • 2



其中sayhello稱為目標(biāo),下方的 echo “hello world!” 是實(shí)現(xiàn)目標(biāo)的命令。其中echo前面是TAB制表符,而不能是空格。
對于文件名,可以叫Makefile或makefile,也可以自定義名稱。對于是否自定義Makefile文件名的區(qū)別在于使用方式不同。


采用默認(rèn)名稱makefile或Makefile:有兩種方法,我們的Makefile文件名為Makefile


make -f 文件名 目標(biāo)名
  • 1




make -f Makefile sayhello
  • 1



或者


make 目標(biāo)名
  • 1




make -f make.txt sayhello
  • 1



如果不指定目標(biāo)名字,則默認(rèn)執(zhí)行最前面的目標(biāo)。



makefile三要素:目標(biāo);依賴;命令


makefile執(zhí)行原理:從上到下建立依賴關(guān)系;從下到上執(zhí)行


makefile建立

通過實(shí)現(xiàn)一個(gè)加減乘除方法作為例子,文件結(jié)構(gòu)如圖所示



src中文件如圖所示:



然后編寫src中Makefile文件


最簡單的makefile

  1. app:add.c jian.c cheng.c chu.c main.c


  2. gcc add.c jian.c cheng.c chu.c main.c -I../include -o app



makefile進(jìn)階

  1. app:add.o jian.o cheng.o chu.o main.o


  2. gcc add.o jian.o cheng.o chu.o main.o -o app


  3. add.o:add.c


  4. gcc -c add.c -I../include


  5. jian.o:jian.c


  6. gcc -c jian.c -I../include


  7. cheng.o:cheng.c


  8. gcc -c cheng.c -I../include


  9. chu.o:chu.c


  10. gcc -c chu.c -I../include


  11. main.o:main.c


  12. gcc -c main.c -I../include



makefile優(yōu)化

(1)常用的變量名(約定俗成的):

CC:表示c編譯器版本


CFLAGS:表示編譯時(shí)參數(shù)


CPPFLAGS:表示預(yù)處理參數(shù)


CXX:表示C 編譯器版本


CXXFLAGS:表示c 編譯時(shí)參數(shù)


LDFLAGS:表示庫參數(shù)庫選項(xiàng)


INCLUDE:表示頭文件目錄


TARGET:表示目標(biāo)名


RM:刪除選項(xiàng)


(2)一些特殊字符

$(變量):對變量取值


@:只顯示命令結(jié)果,忽略命令本身


-:如果當(dāng)前命令出錯,忽略錯誤,繼續(xù)執(zhí)行


%:通配符,通配符是以遍歷的方式實(shí)現(xiàn)的


(3)特殊變量

用于當(dāng)前目標(biāo):


$@:代表目標(biāo)


$<:代表依賴中的第一個(gè)


$^:代表所有依賴


(4)makefile內(nèi)置函數(shù)

wildcard:按照指定格式獲取當(dāng)前目錄下的所有文件名


例:SOURCEFILE=$(wildcard *.c):獲取.c后綴的所有文件并返回賦值給SOURCEFILE


patsubst:根據(jù)指定的格式進(jìn)行替換(字符串替換)


例:DEFFILE=(SOURCEFILE))


代碼

  1. .PHONY:clean #偽目標(biāo)


  2. CC=gcc


  3. INCLUDE=-I../include


  4. CFLAGS=-c -g -Wall $(INCLUDE) #-g增加調(diào)試信息 -Wall嚴(yán)格編譯


  5. CPPFLAGS=-E -D #-E頭文件展開 -D編譯時(shí)定義宏


  6. CXX=g


  7. LDFLAGS=-L../lib -lpthread #這只是個(gè)例子,并沒用到該庫。-l庫名


  8. TARGET=app


  9. RM=rm -rf



  10. SRCFILE=$(wildcard *.c)


  11. DEFFILE=$(patsubst %.c,%.o,$(SRCFILE))



  12. $(TARGET):$(DEFFILE)


  13. $(CC) $^ -o $(TARGET)


  14. %.o:%.c


  15. $(CC) $(CFLAGS) $<



  16. clean:


  17. -$(RM) $(TARGET) $(DEFFILE)


  18. install:


  19. sudo cp $(TARGET) /usr/bin


  20. uninstall:


  21. sudo $(RM) /usr/bin/$(TARGET)




二、Makefile基本結(jié)構(gòu)與依賴

Makefile由一個(gè)個(gè)規(guī)則組成,一個(gè)規(guī)則的結(jié)構(gòu)大致如下:


targets : prerequisites
commands


targets可以有多個(gè)目標(biāo),目標(biāo)之間空格隔開,prerequisites可以包含多個(gè)依賴項(xiàng),依賴項(xiàng)之間空格隔開。


其中 target 為我們要構(gòu)建的目標(biāo),prerequisite為構(gòu)建目標(biāo)的依賴項(xiàng)。command為構(gòu)建目標(biāo)所需的命令。


舉例子來說明,有兩個(gè)c語言程序文件,func.c和main.c:


func.c文件


//func.c
#include
void func()
{
printf("hello world!\n");
}
  • main.c文件


//main.c
extern void func();
int main()
{
func();
return 0;
}
Makefile文件:


all main : main.o func.o
gcc main.o func.o -o main







main.o : main.c
gcc -o main.o -c main.c



func.o : func.c
gcc -o func.o -c func.c



目標(biāo)依賴規(guī)則:


  • 當(dāng)目標(biāo)不存在時(shí),執(zhí)行對應(yīng)命令。


  • 當(dāng)依賴在時(shí)間上比目標(biāo)更新時(shí),執(zhí)行對應(yīng)命令。


  • 當(dāng)依賴關(guān)系連續(xù)存在時(shí),要依次向上回溯每個(gè)目標(biāo)。


上面那個(gè)Makefile中,all和main都是目標(biāo)。all是沒有規(guī)則的終極目標(biāo),他可以用作生成多個(gè)目標(biāo)。把main和all寫在一起的話,make就會檢查main的依賴,如果main是最新的就不會執(zhí)行編譯。


上述Makefile文件,執(zhí)行make all或 make 命令的時(shí)候,先檢查,main是否存在,如果不存在則檢查main的依賴項(xiàng),main.o和func.o這兩個(gè)目標(biāo),依次向上檢查,生成目標(biāo)。
如果目標(biāo)存在,但依賴項(xiàng)比目標(biāo)時(shí)間要新,則也要向上檢查,生成目標(biāo)。


三 偽目標(biāo)的引入

Makefile中的目標(biāo)指什么?


  • Makefile中目標(biāo)一般對應(yīng)著一個(gè)文件


  • make比較目標(biāo)文件和依賴之間的新舊關(guān)系,如果依賴新則執(zhí)行命令


  • make以文件處理作為第一優(yōu)先級


為什么需要引入偽目標(biāo)?


一個(gè)場景是,Makefile文件中有一個(gè)名為clean的目標(biāo)。對應(yīng)的命令是清除相應(yīng)目標(biāo)文件。如果當(dāng)前工作目錄下沒有名為clean的文件,這樣是沒問題的。但是如果當(dāng)前目錄下存在名為clean的文件,那么make每次檢查這個(gè)目標(biāo)的時(shí)候就會發(fā)現(xiàn)這個(gè)文件已經(jīng)存在了,clean是最新的,導(dǎo)致clean目標(biāo)對應(yīng)的清除命令不會執(zhí)行。



四 Makefile中變量的定義及使用



  1. CC := gcc


  2. TAGRET := hello.out



  3. $(TARGET): func.o main.o


  4. $(CC) -o $(TARGET) func.O



上述Makefile中第一二行依次定義了變量CC、TARGET,第四五行引用了這兩個(gè)變量,引用變量采用"變量名或者{變量名}"的形式。



Makefile中的變量只能是字符串類型。


Makefile中變量有四種賦值方式:


1,簡單賦值( := ) 編程語言中常規(guī)理解的賦值方式,只對當(dāng)前語句的變量有效


2,遞歸賦值( = )賦值語句可能影響多個(gè)變量,所有目標(biāo)變量相關(guān)的其他變量都受影響


3,條件賦值( ?= )如果變量未定義,則使用符號中的值定義變量。如果該變量已經(jīng)賦值,則該賦值語句無效。


4,追加賦值( = )原變量用空格隔開的方式追加一個(gè)新值



用例子來了解一下各個(gè)賦值的差別:



簡單賦值



  1. x := foo


  2. y := $(x)b


  3. x := new



  4. .PHONY : test


  5. test:


  6. @echo "y => $(y)"


  7. @echo "x => $(x)"


輸出值:


x => new


y => foob



遞歸賦值


  1. x = foo


  2. y = $(x)b


  3. x = new



  4. .PHONY : test


  5. test:


  6. @echo "y => $(y)"


  7. @echo "x => $(x)"


輸出值:


y = > newb


x => new



條件賦值


  1. x := foo


  2. y := $(x)b


  3. x ?= new



  4. .PHONY : test


  5. test:


  6. @echo "y => $(y)"


  7. @echo "x => $(x)"


輸出值:


y => foob


x = foo



追加賦值


  1. x := foo


  2. y := $(x)b


  3. x = $(y)



  4. .PHONY : test


  5. test:


  6. @echo "y => $(y)"


  7. @echo "x => $(x)"


輸出結(jié)果:


y => foob


x => foo foob



遞歸賦值就是一個(gè)連鎖反應(yīng),只要之前與該變量直接產(chǎn)生過關(guān)聯(lián)的變量都會有影響。


條件賦值,第一次為變量賦值的時(shí)候推薦條件賦值。



五 Makefile中的變量值的替換



1.使用指定字符串替換變量中的后綴字符(串)


格式:{var:a=b}


注意:替換表達(dá)式中不能有空格】


例:


  1. src := acc bcc ccc


  2. obj := $(src:cc=o)


  3. test:


  4. @echo "obj => $(obj)"


make test輸出結(jié)果:


ao bo co



2.變量的模式替換


使用%保留變量值中的指定字符串,替換替他字符


格式:{var:a%b=x%y}


注意:替換表達(dá)式中不能有空格


例:


  1. src := a123b.c a234b.c ajkhb.c


  2. obj := $(src:a%b.c=x%y)


  3. test:


  4. @echo "obj => $(obj)"



分析:原串 a123b.c按照a%b.c進(jìn)行模式匹配的時(shí)候a與b.c中間的123就會被%匹配到,后邊就會被保留下來,a和b.c就會被x和y取代。其他的類似。


make test執(zhí)行結(jié)果:


x123y x234y xjkhy



3.規(guī)則中的模式替換


targets:target-pattern:prereq-pattern


command1


command2


意義:通過target-pattern從targets中匹配子目標(biāo),再通過prereq-pattern從子目標(biāo)生成依賴,進(jìn)而構(gòu)成完整規(guī)則。


例:


  1. objs := func.o main.o


  2. $(objs): %.o : %.c


  3. gcc -o $@ -c $^


分析:


上述第二行,通過%.o匹配objs中的func.o,通過func.c生成依賴,再匹配main.o生成main.c依賴。


上述第二行會被make程序解析成


  1. func.o: func.c


  2. gcc -o $@ -c $^


  3. main.o: main.c


  4. gcc -o $@ -c $^




4.變量的嵌套引用


一個(gè)變量名中可以包含對其他變量的引用


嵌套引用的本質(zhì)是使用一個(gè)變量表示另外一個(gè)變量


例:


  1. x := y


  2. y := z


  3. a := $($(x))


分析: 這個(gè)很好理解,上述第三行可以解析為


a := $(y) ==> a := z
5.命令行變量


在shell中運(yùn)行make的時(shí)候,在命令行中定義變量


命令行變量可以默認(rèn)覆蓋Makefile中定義的變量。


例:


  1. hm := hello makefile


  2. test:


  3. @echo "hm => $(hm)"



shell中執(zhí)行 make hm = cmd


執(zhí)行結(jié)果: hm => cmd



6.override關(guān)鍵字


override關(guān)鍵字用于保護(hù)Makefile中的變量不被覆蓋。


  1. override var := dest


  2. test:


  3. @echo "var => $(var)"


shell中執(zhí)行 make hm = cmd


執(zhí)行結(jié)果: var =>dest


這個(gè)類似于C 中的const關(guān)鍵字



7.define關(guān)鍵字


define關(guān)鍵字用于在Makefile中定義多行變量


變量定義從變量名開始到endef結(jié)束


define定義的變量等價(jià)于使用 = 定義的變量(遞歸賦值)


例:


  1. define ade


  2. Jack!


  3. Tom!


  4. endef


可以加上override 修飾



  1. over define cmd


  2. @echo "Run cmd ls..."


  3. @ls


  4. endif



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計(jì)工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉