亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? make.html

?? 清華Linux講座
?? HTML
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">

<HTML>

<HEAD>

    <TITLE>GNU make 和 makefile</TITLE>

    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">

    <META NAME="GENERATOR" CONTENT="StarOffice/5.1 (Linux)">

    <META NAME="AUTHOR" CONTENT="Yongming Wei">

    <META NAME="CREATED" CONTENT="20000329;17342600">

    <META >

    <STYLE>

    <!--

        H1 { color: #ffff00 }

        H2 { color: #ffff00 }

        H3 { color: #ff00ff }

        H4 { color: #ffff00 }

        TD P { color: #b880b8 }

        LI { color: #ffffff }

        P { color: #00ffff }

        A:link { color: #00b8ff }

        A:visited { color: #ff3366 }

    -->

    </STYLE>

</HEAD>

<BODY TEXT="#ffff00" LINK="#00b8ff" VLINK="#ff3366" BACKGROUND="../images/velvet.jpg">



<A HREF="compiler.html"><IMG SRC="prev.gif" ALT="Previous"></A>

<A HREF="utilities.html"><IMG SRC="next.gif" ALT="Next"></A>

<A HREF="index.html"><IMG SRC="toc.gif" ALT="Contents"></A>



<H1 ALIGN=CENTER>1.9&nbsp;&nbsp;GNU make 和 makefile<BR><BR>

</H1>



<UL>

    <LI><P>GNU make</LI>

    <LI><P>makefile 基本結構</LI>

    <LI><P>makefile 變量</LI>

    <LI><P>GNU make 的主要預定義變量</LI>

    <LI><P>隱含規則</LI>

    <LI><P>makefile 范例</LI>

    <LI><P>運行 make</LI>

</UL>



<H3>1.9.1&nbsp;&nbsp;GNU make</H3>

<PRE>

在大型的開發項目中,通常有幾十到上百個的源文件,如果每次均手工鍵入 gcc 命令進行編譯的話,則會

非常不方便。因此,人們通常利用 make 工具來自動完成編譯工作。這些工作包括:如果僅修改了某幾個

源文件,則只重新編譯這幾個源文件;如果某個頭文件被修改了,則重新編譯所有包含該頭文件的源文件。

利用這種自動編譯可大大簡化開發工作,避免不必要的重新編譯。

實際上,make 工具通過一個稱為 makefile 的文件來完成并自動維護編譯工作。makefile 需要按照某種

語法進行編寫,其中說明了如何編譯各個源文件并連接生成可執行文件,并定義了源文件之間的依賴關系。

當修改了其中某個源文件時,如果其他源文件依賴于該文件,則也要重新編譯所有依賴該文件的源文件。

makefile 文件是許多編譯器,包括 Windows NT 下的編譯器維護編譯信息的常用方法,只是在集成開發環

境中,用戶通過友好的界面修改 makefile 文件而已。

默認情況下,GNU make 工具在當前工作目錄中按如下順序搜索 makefile:

* GNUmakefile

* makefile

* Makefile

在 UNIX 系統中,習慣使用 Makefile 作為 makfile 文件。如果要使用其他文件作為 makefile,則可利用類

似下面的 make 命令選項指定 makefile 文件:

$ make -f Makefile.debug

</PRE>



<H3>1.9.2&nbsp;&nbsp;makefile 基本結構</H3>

<PRE>

makefile 中一般包含如下內容:

* 需要由 make 工具創建的項目,通常是目標文件和可執行文件。通常使用“目標(target)”一詞來表示

要創建的項目。

* 要創建的項目依賴于哪些文件。

* 創建每個項目時需要運行的命令。

例如,假設你現在有一個 C++ 源文件 test.C,該源文件包含有自定義的頭文件 test.h,則目標文件 test.o

 明確依賴于兩個源文件:test.C 和 test.h。另外,你可能只希望利用 g++ 命令來生成 test.o 目標文件。

這時,就可以利用如下的 makefile 來定義 test.o 的創建規則:



# This makefile just is a example.

# The following lines indicate how test.o depends

# test.C and test.h, and how to create test.o



test.o: test.C test.h

    g++ -c -g test.C



從上面的例子注意到,第一個字符為 # 的行為注釋行。第一個非注釋行指定 test.o 為目標,并且依賴于 

test.C 和 test.h 文件。隨后的行指定了如何從目標所依賴的文件建立目標。

當 test.C 或 test.h 文件在編譯之后又被修改,則 make 工具可自動重新編譯 test.o,如果在前后兩次

編譯之間,test.C 和 test.h 均沒有被修改,而且 test.o 還存在的話,就沒有必要重新編譯。這種依賴

關系在多源文件的程序編譯中尤其重要。通過這種依賴關系的定義,make 工具可避免許多不必要的編譯工

作。當然,利用 Shell 腳本也可以達到自動編譯的效果,但是,Shell 腳本將全部編譯任何源文件,包括

哪些不必要重新編譯的源文件,而 make 工具則可根據目標上一次編譯的時間和目標所依賴的源文件的更新

時間而自動判斷應當編譯哪個源文件。

一個 makefile 文件中可定義多個目標,利用 make target 命令可指定要編譯的目標,如果不指定目標,

則使用第一個目標。通常,makefile 中定義有 clean 目標,可用來清除編譯過程中的中間文件,例如:

clean:

    rm -f *.o

運行 make clean 時,將執行 rm -f *.o 命令,最終刪除所有編譯過程中產生的所有中間文件。

</PRE>



<H3>1.9.3&nbsp;&nbsp;makefile 變量</H3>

<PRE>

GNU 的 make 工具除提供有建立目標的基本功能之外,還有許多便于表達依賴性關系以及建立目標的命令的特

色。其中之一就是變量或宏的定義能力。如果你要以相同的編譯選項同時編譯十幾個 C 源文件,而為每個目

標的編譯指定冗長的編譯選項的話,將是非常乏味的。但利用簡單的變量定義,可避免這種乏味的工作:



# Define macros for name of compiler

CC = gcc



# Define a macr o for the CC flags

CFLAGS = -D_DEBUG -g -m486



# A rule for building a object file

test.o: test.c test.h

    $(CC) -c $(CFLAGS) test.c



在上面的例子中,CC 和 CFLAGS 就是 make 的變量。GNU make 通常稱之為變量,而其他 UNIX 的 make 

工具稱之為宏,實際是同一個東西。在 makefile 中引用變量的值時,只需變量名之前添加 $ 符號,如

上面的 $(CC) 和 $(CFLAGS)。

</PRE>



<H3>1.9.4&nbsp;&nbsp;GNU make 的主要預定義變量</H3>

<PRE>

GNU make 有許多預定義的變量,這些變量具有特殊的含義,可在規則中使用。表 1-5 給出了一些主要的

預定義變量,除這些變量外,GNU make 還將所有的環境變量作為自己的預定義變量。



                        表 1-5  GNU make 的主要預定義變量

預定義變量                      含義

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

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

$<              第一個依賴文件的名稱。

$?              所有的依賴文件,以空格分開,這些依賴文件的修改日期比目標的創建日期晚。

$@              目標的完整名稱。

$^              所有的依賴文件,以空格分開,不包含重復的依賴文件。

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

                為 mytarget.so(image.o),則 $@ 為 mytarget.so,而 $% 為 image.o。

AR              歸檔維護程序的名稱,默認值為 ar。

ARFLAGS         歸檔維護程序的選項。

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

ASFLAGS         匯編程序的選項。

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

CCFLAGS         C 編譯器的選項。

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

CPPFLAGS        C 預編譯的選項。

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

CXXFLAGS        C++ 編譯器的選項。

FC              FORTRAN 編譯器的名稱,默認值為 f77。

FFLAGS          FORTRAN 編譯器的選項。

</PRE>



<H3>1.9.5&nbsp;&nbsp;隱含規則</H3>

<PRE>

GNU make 包含有一些內置的或隱含的規則,這些規則定義了如何從不同的依賴文件建立特定類型的目標。

GNU make 支持兩種類型的隱含規則:

* 后綴規則(Suffix Rule)。后綴規則是定義隱含規則的老風格方法。后綴規則定義了將一個具有某個

后綴的文件(例如,.c 文件)轉換為具有另外一種后綴的文件(例如,.o 文件)的方法。每個后綴規

則以兩個成對出現的后綴名定義,例如,將 .c 文件轉換為 .o 文件的后綴規則可定義為:



.c.o:

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



* 模式規則(pattern rules)。這種規則更加通用,因為可以利用模式規則定義更加復雜的依賴性規則。

模式規則看起來非常類似于正則規則,但在目標名稱的前面多了一個 % 號,同時可用來定義目標和依賴

文件之間的關系,例如下面的模式規則定義了如何將任意一個 X.c 文件轉換為 X.o 文件:



%.c:%.o

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



</PRE>



<H3>1.9.6&nbsp;&nbsp;makefile 范例</H3><P#SAMPLE#>

<p></P>



<H3>1.9.7&nbsp;&nbsp;運行 make</H3>

<PRE>

我們知道,直接在 make 命令的后面鍵入目標名可建立指定的目標,如果直接運行 make,則建立第一個

目標。我們還知道可以用 make -f mymakefile 這樣的命令指定 make 使用特定的 makefile,而不是

默認的 GNUmakefile、makefile 或 Makefile。但 GNU make 命令還有一些其他選項,表 1-6 給出了

這些選項。



                        表 1-6  GNU make 命令的常用命令行選項



命令行選項              含義

-C DIR              在讀取 makefile 之前改變到指定的目錄 DIR。

-f FILE             以指定的 FILE 文件作為 makefile。

-h                  顯示所有的 make 選項。

-i                  忽略所有的命令執行錯誤。

-I DIR              當包含其他 makefile 文件時,可利用該選項指定搜索目錄。

-n                  只打印要執行的命令,但不執行這些命令。

-p                  顯示 make 變量數據庫和隱含規則。

-s                  在執行命令時不顯示命令。

-w                  在處理 makefile 之前和之后,顯示工作目錄。

-W FILE             假定文件 FILE 已經被修改。

</PRE>



<P>

<BR><BR>

</P>



<P ALIGN=CENTER>

<IMG SRC="../images/striped.gif" NAME="Ruler" ALIGN=BOTTOM WIDTH=532 HEIGHT=13 BORDER=0></P>



<P>

<BR><BR>

</P>



<A HREF="compiler.html"><IMG SRC="prev.gif" ALT="Previous"></A>

<A HREF="utilities.html"><IMG SRC="next.gif" ALT="Next"></A>

<A HREF="index.html"><IMG SRC="toc.gif" ALT="Contents"></A>



</BODY>

</HTML>



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆精品国产自产在线| 久久精品国产99国产精品| 成人精品高清在线| 国产日韩欧美一区二区三区综合| 国内久久婷婷综合| 国产欧美精品一区二区色综合| 国产成人午夜精品5599| 欧美激情综合五月色丁香小说| 成人国产精品视频| 有码一区二区三区| 欧美妇女性影城| 精品无人码麻豆乱码1区2区| 久久精品欧美日韩| 色婷婷激情综合| 日韩黄色免费网站| 国产亚洲欧美一区在线观看| eeuss鲁片一区二区三区| 亚洲黄色小视频| 欧美草草影院在线视频| 成人免费视频一区二区| 亚洲综合偷拍欧美一区色| 欧美一区二区三区成人| 国产 欧美在线| 亚洲成人三级小说| 亚洲精品一区二区精华| 99久久婷婷国产精品综合| 亚洲高清免费视频| 国产视频一区在线播放| 欧洲视频一区二区| 狠狠色综合播放一区二区| 亚洲人成网站影音先锋播放| 制服丝袜中文字幕亚洲| 成人h动漫精品| 麻豆成人在线观看| 国产精品成人一区二区艾草 | 久久久高清一区二区三区| 东方欧美亚洲色图在线| 亚洲成国产人片在线观看| 国产亚洲欧美激情| 7777精品伊人久久久大香线蕉 | 91污在线观看| 精品在线免费视频| 亚洲国产视频网站| 欧美韩国日本综合| 91精品久久久久久蜜臀| 99vv1com这只有精品| 久久精品国产99| 亚洲国产人成综合网站| 中文字幕在线一区| 日韩美女在线视频| 欧美艳星brazzers| av在线播放一区二区三区| 久久超级碰视频| 亚洲一区二区三区激情| 一区精品在线播放| 久久久国际精品| 日韩亚洲欧美一区二区三区| 日本韩国欧美在线| 成人精品视频一区二区三区尤物| 久久疯狂做爰流白浆xx| 亚洲一级二级在线| 亚洲欧美福利一区二区| 亚洲国产成人一区二区三区| 精品免费一区二区三区| 日韩一区二区中文字幕| 欧美美女一区二区在线观看| 色94色欧美sute亚洲线路二| 成人国产免费视频| 成人动漫在线一区| 成人精品免费看| 国产91在线看| 粉嫩13p一区二区三区| 国产乱码字幕精品高清av| 美女性感视频久久| 人妖欧美一区二区| 久久国产视频网| 裸体一区二区三区| 男男gaygay亚洲| 免费成人你懂的| 久久国产成人午夜av影院| 九九**精品视频免费播放| 蜜桃av一区二区| 久久不见久久见免费视频7| 美洲天堂一区二卡三卡四卡视频| 青青草国产成人av片免费| 免费看黄色91| 韩国一区二区三区| 国产一区二区在线观看免费| 国产精品99久久久久久似苏梦涵| 国产精品99久| 波多野结衣中文字幕一区二区三区| 93久久精品日日躁夜夜躁欧美| 91在线播放网址| 欧美性三三影院| 日韩欧美色电影| 国产人成亚洲第一网站在线播放| 国产精品美日韩| 亚洲综合在线电影| 石原莉奈在线亚洲二区| 另类小说一区二区三区| 国产精品夜夜嗨| av电影在线观看不卡| 91黄视频在线| 欧美一级爆毛片| 国产精品毛片a∨一区二区三区| 专区另类欧美日韩| 天天色综合成人网| 韩国精品久久久| 91免费观看在线| 欧美一级理论性理论a| 久久无码av三级| 亚洲免费观看高清完整版在线观看| 亚洲一二三四久久| 久久成人久久鬼色| 一本在线高清不卡dvd| 3d成人h动漫网站入口| 国产精品久久久爽爽爽麻豆色哟哟 | 色94色欧美sute亚洲线路一ni| 欧美一区二区大片| 1区2区3区欧美| 蜜臀av亚洲一区中文字幕| 成人va在线观看| 欧美精品少妇一区二区三区| 国产性天天综合网| 性欧美大战久久久久久久久| 国产不卡视频一区| 91精品国产一区二区三区| 国产欧美综合在线观看第十页| 亚洲午夜激情网站| 国产成a人亚洲精品| 制服视频三区第一页精品| 国产精品视频在线看| 日日欢夜夜爽一区| 一本一道久久a久久精品综合蜜臀| 日韩欧美在线影院| 亚洲一区二区av在线| 成人综合在线网站| 日韩免费看的电影| 亚洲国产日韩精品| 99久久777色| 国产欧美va欧美不卡在线| 欧美a级一区二区| 欧美日韩中文精品| 中文字幕中文字幕一区二区| 国产在线精品国自产拍免费| 欧美精品一级二级| 亚洲丶国产丶欧美一区二区三区| 波多野结衣中文字幕一区二区三区| 日韩免费观看2025年上映的电影| 亚洲国产精品一区二区尤物区| 99这里只有久久精品视频| 久久综合一区二区| 久久国产精品99久久人人澡| 欧美日韩国产一二三| 亚洲免费观看高清完整版在线 | 毛片av一区二区三区| 欧洲视频一区二区| 夜夜精品浪潮av一区二区三区| 高清视频一区二区| 久久精品欧美一区二区三区麻豆| 精品一区二区免费在线观看| 91精品国产全国免费观看| 午夜精品福利一区二区蜜股av| 91免费视频网| 亚洲美女少妇撒尿| 在线一区二区三区| 一区二区三区高清在线| 欧洲激情一区二区| 亚洲成精国产精品女| 欧美日本一区二区| 天堂久久久久va久久久久| 欧美精品精品一区| 日本欧美肥老太交大片| 91精品国产综合久久久蜜臀粉嫩| 日本伊人色综合网| 欧美成人精品二区三区99精品| 久久国产综合精品| 久久久久久日产精品| 国产99久久久国产精品潘金 | 精品视频1区2区| 视频一区国产视频| 日韩欧美国产综合| 国产在线视视频有精品| 国产视频在线观看一区二区三区| www.欧美日韩国产在线| 亚洲美女一区二区三区| 欧美图片一区二区三区| 男女激情视频一区| 国产拍揄自揄精品视频麻豆| 一本久久精品一区二区| 亚洲一区二区高清| 26uuu亚洲| av不卡在线观看| 亚洲成av人影院| 久久女同精品一区二区| a级精品国产片在线观看| 一区二区三区欧美| 日韩午夜av电影| 国产一区 二区 三区一级| 亚洲欧洲国产专区|