新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux下C編程基礎(chǔ)之:make工程管理器

Linux下C編程基礎(chǔ)之:make工程管理器

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


本文引用地址:http://m.butianyuan.cn/article/257149.htm

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

遞歸展開方式的定義格式為:VAR=var。

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

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


注意

變量名是不包括“:”、“#”、“=”以及結(jié)尾空格的任何字符串。同時(shí),變量名中包含字母、數(shù)字以及下劃線以外的情況應(yīng)盡量避免,因?yàn)樗鼈兛赡茉趯?lái)被賦予特別的含義。

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

推薦在makefile內(nèi)部使用小寫字母作為變量名,預(yù)留大寫字母作為控制隱含規(guī)則參數(shù)或用戶重載命令選項(xiàng)參數(shù)的變量名。


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

經(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


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


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


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

表3.15 makefile中常見的預(yù)定義變量

預(yù)定義變量

含義

AR

庫(kù)文件維護(hù)程序的名稱,默認(rèn)值為ar

AS

匯編程序的名稱,默認(rèn)值為as

CC

C編譯器的名稱,默認(rèn)值為cc

CPP

C預(yù)編譯器的名稱,默認(rèn)值為$(CC)–E

CXX

C++編譯器的名稱,默認(rèn)值為g++

FC

Fortran編譯器的名稱,默認(rèn)值為f77

RM

文件刪除程序的名稱,默認(rèn)值為rm–f

ARFLAGS

庫(kù)文件維護(hù)程序的選項(xiàng),無(wú)默認(rèn)值

ASFLAGS

匯編程序的選項(xiàng),無(wú)默認(rèn)值

CFLAGS

C編譯器的選項(xiàng),無(wú)默認(rèn)值

CPPFLAGS

C預(yù)編譯的選項(xiàng),無(wú)默認(rèn)值

CXXFLAGS

C++編譯器的選項(xiàng),無(wú)默認(rèn)值

FFLAGS

Fortran編譯器的選項(xiàng),無(wú)默認(rèn)值


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


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


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

自動(dòng)變量

含義

$*

不包含擴(kuò)展名的目標(biāo)文件名稱

$+

所有的依賴文件,以空格分開,并以出現(xiàn)的先后為序,可能包含重復(fù)的依賴文件

$

第一個(gè)依賴文件的名稱

$?

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

$@

目標(biāo)文件的完整名稱

$^

所有不重復(fù)的依賴文件,以空格分開

$%

如果目標(biāo)是歸檔成員,則該變量表示目標(biāo)的歸檔成員名稱


自動(dòng)變量的書寫比較難記,但是在熟練了之后使用會(huì)非常方便,請(qǐng)讀者結(jié)合下例中的自動(dòng)變量改寫的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)境變量的方法相對(duì)比較簡(jiǎn)單,make在啟動(dòng)時(shí)會(huì)自動(dòng)讀取系統(tǒng)當(dāng)前已經(jīng)定義了的環(huán)境變量,并且會(huì)創(chuàng)建與之具有相同名稱和數(shù)值的變量。但是,如果用戶在makefile中定義了相同名稱的變量,那么用戶自定義變量將會(huì)覆蓋同名的環(huán)境變量。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

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




評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉