新聞中心

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

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

        作者: 時間:2013-09-13 來源:網絡 收藏


        本文引用地址:http://www.104case.com/article/257149.htm

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

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

        簡單擴展方式的定義格式為:VAR:=var。

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


        注意

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

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

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


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

        經變量替換后的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中的變量分為用戶自定義變量、預定義變量、自動變量及環境變量。如上例中的OBJS就是用戶自定義變量,自定義變量的值由用戶自行設定,而預定義變量和自動變量為通常在makefile都會出現的變量,它們的一部分有默認值,也就是常見的設定值,當然用戶可以對其進行修改。


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

        表3.15 makefile中常見的預定義變量

        預定義變量

        含義

        AR

        庫文件維護程序的名稱,默認值為ar

        AS

        匯編程序的名稱,默認值為as

        CC

        C編譯器的名稱,默認值為cc

        CPP

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

        CXX

        C++編譯器的名稱,默認值為g++

        FC

        Fortran編譯器的名稱,默認值為f77

        RM

        文件刪除程序的名稱,默認值為rm–f

        ARFLAGS

        庫文件維護程序的選項,無默認值

        ASFLAGS

        匯編程序的選項,無默認值

        CFLAGS

        C編譯器的選項,無默認值

        CPPFLAGS

        C預編譯的選項,無默認值

        CXXFLAGS

        C++編譯器的選項,無默認值

        FFLAGS

        Fortran編譯器的選項,無默認值


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


        由于常見的gcc編譯語句中通常包含了目標文件和依賴文件,而這些文件在makefile文件中目標體所在行已經有所體現,因此,為了進一步簡化makefile的編寫,就引入了自動變量。自動變量通常可以代表編譯語句中出現目標文件和依賴文件等,并且具有本地含義(即下一語句中出現的相同變量代表的是下一語句的目標文件和依賴文件)。表3.16列出了makefile中常見的自動變量。


        表3.16 makefile中常見的自動變量

        自動變量

        含義

        $*

        不包含擴展名的目標文件名稱

        $+

        所有的依賴文件,以空格分開,并以出現的先后為序,可能包含重復的依賴文件

        $

        第一個依賴文件的名稱

        $?

        所有時間戳比目標文件晚的依賴文件,并以空格分開

        $@

        目標文件的完整名稱

        $^

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

        $%

        如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱


        自動變量的書寫比較難記,但是在熟練了之后使用會非常方便,請讀者結合下例中的自動變量改寫的makefile進行記憶。


        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中還可以使用環境變量。使用環境變量的方法相對比較簡單,make在啟動時會自動讀取系統當前已經定義了的環境變量,并且會創建與之具有相同名稱和數值的變量。但是,如果用戶在makefile中定義了相同名稱的變量,那么用戶自定義變量將會覆蓋同名的環境變量。

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

        linux相關文章:linux教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 姜堰市| 西安市| 东台市| 集安市| 图木舒克市| 蒲城县| 凤庆县| 镇远县| 滕州市| 普兰店市| 巴楚县| 灵山县| 冀州市| 景泰县| 铜陵市| 彭水| 宁德市| 黄陵县| 盘山县| 阆中市| 娄烦县| 社旗县| 铜川市| 西乌珠穆沁旗| 平利县| 长子县| 将乐县| 禹城市| 铜山县| 恩平市| 平武县| 防城港市| 仪征市| 南京市| 定南县| 新平| 镇康县| 邹平县| 宣化县| 桂东县| 咸宁市|