<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux下C編程基礎之:make工程管理器

Linux下C編程基礎之:make工程管理器

作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏


本文引用地址:http://dyxdggzs.com/article/257149.htm

為了避免上述問(wèn)題,簡(jiǎn)單擴展型變量的值在定義處展開(kāi),并且只展開(kāi)一次,因此它不包含任何對其他變量的引用,從而消除變量的嵌套引用。

遞歸展開(kāi)方式的定義格式為:VAR=var。

簡(jiǎn)單擴展方式的定義格式為:VAR:=var。

make中的變量使用均使用的格式為:$(VAR)。


注意

變量名是不包括“:”、“#”、“=”以及結尾空格的任何字符串。同時(shí),變量名中包含字母、數字以及下劃線(xiàn)以外的情況應盡量避免,因為它們可能在將來(lái)被賦予特別的含義。

變量名是大小寫(xiě)敏感的,例如變量名“foo”、“FOO”、和“Foo”代表不同的變量。

推薦在makefile內部使用小寫(xiě)字母作為變量名,預留大寫(xiě)字母作為控制隱含規則參數或用戶(hù)重載命令選項參數的變量名。


下面給出了上例中用變量替換修改后的makefile,這里用OBJS代替kang.o和yul.o,用CC代替gcc,用CFLAGS代替“-Wall-O–g”。這樣在以后修改時(shí),就可以只修改變量定義,而不需要修改下面的定義實(shí)體,從而大大簡(jiǎn)化了makefile維護的工作量。

經(jīng)變量替換后的makefile如下所示:


OBJS=kang.oyul.o

CC=gcc

CFLAGS=-Wall-O-g

david:$(OBJS)

$(CC)$(OBJS)-odavid

kang.o:kang.ckang.h

$(CC)$(CFLAGS)-ckang.c-okang.o

yul.o:yul.cyul.h

$(CC)$(CFLAGS)-cyul.c-oyul.o


可以看到,此處變量是以遞歸展開(kāi)方式定義的。


makefile中的變量分為用戶(hù)自定義變量、預定義變量、自動(dòng)變量及環(huán)境變量。如上例中的OBJS就是用戶(hù)自定義變量,自定義變量的值由用戶(hù)自行設定,而預定義變量和自動(dòng)變量為通常在makefile都會(huì )出現的變量,它們的一部分有默認值,也就是常見(jiàn)的設定值,當然用戶(hù)可以對其進(jìn)行修改。


預定義變量包含了常見(jiàn)編譯器、匯編器的名稱(chēng)及其編譯選項。表3.15列出了makefile中常見(jiàn)預定義變量及其部分默認值。

表3.15 makefile中常見(jiàn)的預定義變量

預定義變量

含義

AR

庫文件維護程序的名稱(chēng),默認值為ar

AS

匯編程序的名稱(chēng),默認值為as

CC

C編譯器的名稱(chēng),默認值為cc

CPP

C預編譯器的名稱(chēng),默認值為$(CC)–E

CXX

C++編譯器的名稱(chēng),默認值為g++

FC

Fortran編譯器的名稱(chēng),默認值為f77

RM

文件刪除程序的名稱(chēng),默認值為rm–f

ARFLAGS

庫文件維護程序的選項,無(wú)默認值

ASFLAGS

匯編程序的選項,無(wú)默認值

CFLAGS

C編譯器的選項,無(wú)默認值

CPPFLAGS

C預編譯的選項,無(wú)默認值

CXXFLAGS

C++編譯器的選項,無(wú)默認值

FFLAGS

Fortran編譯器的選項,無(wú)默認值


可以看出,上例中的CC和CFLAGS是預定義變量,其中由于CC沒(méi)有采用默認值,因此,需要把“CC=gcc”明確列出來(lái)。


由于常見(jiàn)的gcc編譯語(yǔ)句中通常包含了目標文件和依賴(lài)文件,而這些文件在makefile文件中目標體所在行已經(jīng)有所體現,因此,為了進(jìn)一步簡(jiǎn)化makefile的編寫(xiě),就引入了自動(dòng)變量。自動(dòng)變量通??梢源砭幾g語(yǔ)句中出現目標文件和依賴(lài)文件等,并且具有本地含義(即下一語(yǔ)句中出現的相同變量代表的是下一語(yǔ)句的目標文件和依賴(lài)文件)。表3.16列出了makefile中常見(jiàn)的自動(dòng)變量。


表3.16 makefile中常見(jiàn)的自動(dòng)變量

自動(dòng)變量

含義

$*

不包含擴展名的目標文件名稱(chēng)

$+

所有的依賴(lài)文件,以空格分開(kāi),并以出現的先后為序,可能包含重復的依賴(lài)文件

$

第一個(gè)依賴(lài)文件的名稱(chēng)

$?

所有時(shí)間戳比目標文件晚的依賴(lài)文件,并以空格分開(kāi)

$@

目標文件的完整名稱(chēng)

$^

所有不重復的依賴(lài)文件,以空格分開(kāi)

$%

如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱(chēng)


自動(dòng)變量的書(shū)寫(xiě)比較難記,但是在熟練了之后使用會(huì )非常方便,請讀者結合下例中的自動(dòng)變量改寫(xiě)的makefile進(jìn)行記憶。


OBJS=kang.oyul.o

CC=gcc

CFLAGS=-Wall-O-g

david:$(OBJS)

$(CC)$^-o$@

kang.o:kang.ckang.h

$(CC)$(CFLAGS)-c$-o$@

yul.o:yul.cyul.h

$(CC)$(CFLAGS)-c$-o$@


另外,在makefile中還可以使用環(huán)境變量。使用環(huán)境變量的方法相對比較簡(jiǎn)單,make在啟動(dòng)時(shí)會(huì )自動(dòng)讀取系統當前已經(jīng)定義了的環(huán)境變量,并且會(huì )創(chuàng )建與之具有相同名稱(chēng)和數值的變量。但是,如果用戶(hù)在makefile中定義了相同名稱(chēng)的變量,那么用戶(hù)自定義變量將會(huì )覆蓋同名的環(huán)境變量。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>