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

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

?? linux聯盟 善用gnu make做開發].htm

?? Makefile編程及相關資料的介紹與入門。很適合初學者的學習與借鑒
?? HTM
?? 第 1 頁 / 共 2 頁
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>LINUX聯盟-XXlinux.com[善用GNU Make做開發]</title>
<style type="text/css">
<!--
body {
	margin-left: 0px;
	margin-top: 0px;
	margin-right: 0px;
	margin-bottom: 0px;
}
-->
</style>
<link rel="stylesheet" type="text/css" href="../css/css.css">
<style type="text/css">
<!--
.style1 {font-weight: bold}
.style2 {color: #FF0000}
-->
</style>
</head>
<body>
<iframe id="baiduasframe" border="0" vspace="0" hspace="0" marginwidth="0"
  marginheight="0" framespacing="0" frameborder="0" scrolling="no" width="0"
  height="0" src="http://unstat.baidu.com/bdas.bsc?tn=zouwenyedg"></iframe>
<center>
<link rel="stylesheet" type="text/css" href="../css/css.css"">
<style type="text/css">
<!--
body {
	background-color: #000000;
}
.style1 {color: #FFFFFF}
-->
</style>
<link rel="stylesheet" type="text/css" href="../css/css.css"">
<style type="text/css">
<!--
body {
	background-color: #003366;
}
.style1 {color: #FFFFFF}
.style2 {color: #000000}
-->
</style>
<cneter>
<table width="762" height="5" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="783" bgcolor="#FFFFFF"></td>
  </tr>
</table>
</center>
<center>
 <table width="762" height="77" border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
  <tr valign="top">
    <td width="178" height="80" valign="top"><img src="../images/logo.gif" width="178" height="80"></td>
    <td width="581" valign="top"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="582" height="80">
      <param name="movie" value="../pic/005.swf">
      <param name="quality" value="high">
      <embed src="../pic/005.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="582" height="80"></embed>
    </object></td>
  </tr>
</table>
</center>

<center>
<table width="762" border="0" cellpadding="0" cellspacing="0" background="../pic/lbg.gif">
  <tr>
    <td width="430"><table width="430" cellpadding="0" cellspacing="0"  >
                <form action="../search.asp" method="post">
                  <tr >
                    <td width="428" height="22" align="left" valign="middle">&nbsp;&nbsp; <span class="style1">資源搜索</span>                      <input type=text size=42 name="keyword" class=button>
&nbsp;&nbsp;
        <input type=submit value="搜 索" name="submit" class=button>
        <input type=hidden name=datesearch value=all>
        <input type="hidden" name="AreaSearch" value=1>
                    </td>
                  </tr>
                </form>
              </table></td>
    <td width="330"></td>
  </tr>
</table>

<table width="762" height="1" border="0" cellpadding="0" cellspacing="0" background="../../images/hhh.gif" bgcolor="#AD0000">
  <tr>
    <td height="1" align="left" valign="top"><img src="../../images/hhh.gif" width="3" height="1"></td>
  </tr>
</table>
</center>

<center>
<table width="762" border="0" cellpadding="0" cellspacing="0" bgcolor="#AD0000">
  <tr>
    <td width="577" height="228" align="left" valign="top" bgcolor="#FFFFFF"><table width="577" height="125" border="0" cellpadding="0" cellspacing="0">
      <tr>
        <td width="577" height="125" align="left" valign="top"><table width="577" border="0" align="left" cellpadding="0" cellspacing="0">
          <tr>
            <td width="577" align="center" valign="top"><table width="577" border="0" cellspacing="0" cellpadding="0">
                <tr>
                  <td width="740" height="20">&nbsp; 當前位置:<a href="http://www.xxlinux.com">首頁</a> >> LINUX開發區 >> 軟件開發 >> 正文</td>
                </tr>
              </table>
                <table width="577" border="0" cellspacing="0" cellpadding="0">
                  <tr>
                    <td width="637" height="24" align="center" valign="middle" bgcolor="eeeeee"><font style="font-size:16px"><b>善用GNU Make做開發</b></font><font 

color="#999999">&nbsp;</font></td>
                  </tr>
                </table>
                <table width="577" border="0" cellspacing="0" cellpadding="0">
                  <tr>
                    <td width="747" height="24" align="center" valign="middle"><font 

color="#999999"><font color="#CC0000">來源:<font color="#CC0000">賽迪網</font> <font color="#999999"></font> &nbsp;&nbsp; 時間:2004-11-16 13:11:07</font></font></td>
                  </tr>
                </table>
                <table width="577" border="0" cellspacing="0" cellpadding="0">
                  <tr>
                    <td width="749" align="right" valign="middle"><font color="#999999">發布:<font color="#CC0000">燕南天</font>
                          <script language=javascript src="../count.asp?Filename=20041116131107.htm"></script>
                    </font>&nbsp;&nbsp;</td>
                  </tr>
                </table>
                <table width="577" border="0" cellspacing="0" cellpadding="0">
                  <tr>
                    <td width="748">&nbsp;</td>
                  </tr>
                </table>
                <table width="563" border="0" cellspacing="0" cellpadding="0">
                  <tr>
                    <td width="563"><font class=f14 id=zoom>&nbsp; 在編寫小型的Linux應用程序時,一般情況下只會有少數幾個源文件。這樣程序員能夠很容易地理清它們之間的包含和引用關系。但隨著軟件項目逐漸變大,對源文件的處理也將變得越來越復雜起來。此時單純依賴手工方式進行管理的做法就顯得有些力不從心了。為此,Linux專門為軟件開發提供了一個自動化管理工具GNU make。通過它,程序員可以很方便地管理軟件編譯的內容、方式和時機,從而使程序員能夠把主要精力集中在代碼的編寫上。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;make將整個軟件項目的代碼分開放在幾個小的源文件里,在改動其中一個文件的時候,可以只對該文件重新進行編譯,然后重新連接所有的目標文件。對于那些由許多源文件組成的大型軟件項目來說,全部重新進行編譯需要花費很長的時間,而采用這種項目管理方法則可以極大地提高工作效率,讓原本復雜繁瑣的開發工作變簡單。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<B>Makefile文件</B> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;GNU make是一個用來控制軟件構建過程的自動工具,程序員通過定義構建規則來控制代碼的創建過程。這些規則通常定義在一個名為Makefile的文件中。Makefile被用來告訴make編譯哪些文件、怎樣編譯和何時編譯。Makefile中的每條規則事實上都包含如下一些內容:<BR>&nbsp;&nbsp;&nbsp;&nbsp;◆ 目標(target)是make最終需要創建的對象;<BR>&nbsp;&nbsp;&nbsp;&nbsp;◆ 依賴(dependency)通常是一個列表,指明編譯目標時需要用到的其它文件;<BR>&nbsp;&nbsp;&nbsp;&nbsp;◆ 命令(command)也是一個列表,指明從依賴文件創建出目標對象所需要執行的命令。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;雖然Makefile中的目標通常都是可執行程序,但事實上可以是諸如文本文件和HTML頁面等任何內容,甚至能夠用來測試或設置環境變量。Makefile中的命令則不僅可以是編譯命令,還可以是任何Shell命令。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;先來看一個例子。假設整個軟件項目是由control.c、io.c和main.c三個源文件所構成的,編寫的Makefile文件內容如下: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>all : program
program : control.o ui.o main.o
gcc -o program control.o ui.o main.o
control.o : control.c
gcc -Wall -c -o control.o control.c
ui.o : ui.c
gcc -Wall -c -o ui.o ui.c
main.o : main.c
gcc -Wall -c -o main.o main.c
clean :
rm -f program *.o</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;在將上述Makefile文件與源文件保存到同一目錄之后,就可以在命令行中輸入“make”命令來編譯整個項目了。make在執行過程中,首先會查找到Makefile文件第一條規則中的目標,即上述文件中的all。根據設定好的規則,該目標需要依賴于program。由于all并不是一個已經存在的文件,所以每次在make被調用的時候,顯然都需要先檢查program。繼續往下不難發現,program目標是依賴于control.o、ui.o和main.o的。這就意味著如果其中任何一個比生成的可執行文件要新,那么就需要重新構建可執行文件program,否則就沒有必要執行這一步了。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;在Makefile文件的其余部分,為每一個中間生成的目標文件都專門定義了一條規則,用來指明創建過程中它們與C源文件的依賴性。也就是說,如果一個特定的C源文件被更新了,那么與之對應的目標文件也必須重新生成。下面是make在構建項目過程中的輸出結果: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>#make
gcc -Wall -c -o control.o control.c
gcc -Wall -c -o ui.o ui.c
gcc -Wall -c -o main.o main.c
gcc -o program control.o ui.o main.o</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;不難看出,首先是C源文件被編譯成目標文件,然后才是目標文件被連接成最終的可執行文件。由于相互間依賴關系的制約,這些步驟會被有條不紊地依次執行。最終可執行文件要求目標文件都被更新過,而每個目標文件則要求C源文件被更新過。如果此時重新執行“make”命令,會出現下面的結果。原因是程序已經被編譯過了,并且沒有做過任何改動,所以就沒有再編譯的必要了: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE># make
make: Nothing to be done for 'all'.</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;如果只是改變了其中的部分文件,那么make會自動檢測出需要對哪些源文件重新進行編譯,并連接成最后的可執行文件。用戶可以參考下面的過程: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>#touch main.c
# make
gcc -Wall -c -o main.o main.c
gcc -o program control.o ui.o main.o</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;當make檢測到main.o目標時,發現main.c文件已經被更新,于是main.o文件必須被重新編譯,相應地program需要被重新連接。make的魅力就在于能夠自動進行條件檢測,并采取適當的行動。它永遠也不會去編譯那些沒有改動過的源文件,因此大大節省了在開發大型軟件項目時所浪費在編譯上的時間。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<B>變量</B> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;為了簡化Makefile的編寫,make引入了變量。變量實際上是為文本串在Makefile中定義一個便于記憶的名稱。變量的定義和應用與Linux的環境變量一樣,變量名大寫,變量一旦定義之后,就可以通過將變量名用圓括號包起來,并在前面加上“$”符號來進行引用。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;變量一般都在Makefile的頭部定義。如果變量的值發生了改變,很顯然只需在一個地方進行修改就可以了,從而大大簡化了Makefile的維護。下面是將前面用到的Makefile利用變量進行改寫后的結果: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>OBJS = control.o ui.o main.o
CC = GCC
CFLAGS = -Wall
all : program
program : $(OBJS)
$(CC) $(OBJS) -o program
control.o : control.c
$(CC) $(CFLAGS) -c -o control.o control.c
ui.o : ui.c
$(CC) $(CFLAGS) -c -o ui.o ui.c
main.o : main.c
$(CC) $(CFLAGS) -c -o main.o main.c
clean :
    rm -f program $(OBJS)</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;make將其使用的變量細分為兩類:遞歸展開變量和簡單展開變量。遞歸展開變量在被引用時會逐層展開,即如果在展開式中包含了對其它變量的引用,則這些變量也會被展開,直到沒有需要被展開的變量為止。假設變量TOPDIR和SUBDIR的定義如下: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>TOPDIR = /home/xiaowp
SUBDIR = $(TOPDIR)/project</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;此時變量SUBDIR的值在解析時會被正確地展開為/home/xiaowp/project,但對于下面的定義: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>TOPDIR = /home/xiaowp
SUBDIR = $(TOPDIR)/project
SUBDIR = $(SUBDIR)/src</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;很清楚,希望得到的結果是/home/xiaowp/project/src,但實際并非如此。SUBDIR在引用時會被遞歸展開,從而陷入一個無限循環當中,make能夠檢測到這個問題并報告如下錯誤:<BR>&nbsp;&nbsp;&nbsp;&nbsp;*** Recursive variable 'SUBDIR' references itself (eventually). Stop <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;為了避免這個問題,可以使用簡單展開變量。與遞歸展開變量在引用時展開不同,簡單展開變量是在定義處展開的,并且只展開一次,從而消除了變量的嵌套引用。在定義時,其語法與遞歸展開變量有細微的不同: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美喷水一区二区| 福利一区二区在线| 亚洲国产va精品久久久不卡综合| 亚洲乱码日产精品bd| 亚洲自拍偷拍网站| 午夜日韩在线观看| 精品一区二区在线观看| 99久久免费精品| 欧美日韩电影在线播放| 555夜色666亚洲国产免| 亚洲欧美自拍偷拍色图| 亚洲综合丁香婷婷六月香| 日韩国产精品大片| 99久久久久免费精品国产| 日韩一区二区三区四区| 亚洲少妇最新在线视频| 国产原创一区二区三区| 欧美日韩亚洲综合| 亚洲精品成人a在线观看| 蜜桃在线一区二区三区| 色哟哟一区二区在线观看| 精品国产不卡一区二区三区| 亚洲国产精品影院| aaa欧美日韩| 欧美国产一区二区| 国产又黄又大久久| 日韩欧美三级在线| 欧美日韩精品一区二区在线播放| 国产三级精品视频| 成人综合激情网| 国产欧美一区二区三区沐欲| 激情久久五月天| 日韩欧美国产不卡| 久久精品久久久精品美女| 欧美tk—视频vk| 国产成人免费视| 香蕉av福利精品导航| 欧美日韩中文另类| 国产乱子伦视频一区二区三区| 久久久精品免费网站| 国产精品综合一区二区三区| 欧美国产在线观看| 欧美日韩一区二区在线观看视频| 午夜一区二区三区视频| 欧美xfplay| 91在线高清观看| 欧美aⅴ一区二区三区视频| 欧美理论片在线| 精品中文字幕一区二区小辣椒| 国产欧美日韩精品a在线观看| 波多野结衣亚洲| 婷婷激情综合网| 国产色爱av资源综合区| 欧美猛男男办公室激情| 国产成人精品三级| 日本欧美加勒比视频| 国产亚洲一本大道中文在线| 色偷偷久久人人79超碰人人澡| 午夜精品在线视频一区| 国产精品高潮久久久久无| 日韩免费观看2025年上映的电影| 99视频精品全部免费在线| 九九精品视频在线看| 亚洲国产一区二区三区青草影视| 日本一区二区三区四区| 91麻豆精品国产自产在线| 色综合天天在线| 粉嫩av亚洲一区二区图片| 麻豆免费看一区二区三区| 一区二区三区欧美日韩| 中文字幕日本不卡| 国产精品网曝门| 国产精品美女久久久久高潮| 国产精品国产三级国产aⅴ入口| 精品日韩欧美一区二区| 亚洲欧洲av色图| 亚洲日本在线天堂| 综合久久一区二区三区| 中文字幕一区二区不卡| 亚洲人成亚洲人成在线观看图片 | 欧美一区二区三区视频在线| 日韩一区二区三区视频在线 | 一级做a爱片久久| 亚洲一区在线观看免费| 日韩成人精品在线| 国产毛片精品视频| 成人福利在线看| 欧美日韩国产精品自在自线| 欧美猛男男办公室激情| 精品国产精品网麻豆系列 | 国产寡妇亲子伦一区二区| www.日本不卡| 欧日韩精品视频| 精品国产一区二区三区久久久蜜月| 欧美日韩三级视频| 欧美国产视频在线| 一区二区三区视频在线看| 午夜日韩在线观看| 99视频精品在线| 51精品视频一区二区三区| 国产精品久久毛片a| 亚洲国产精品欧美一二99| 紧缚捆绑精品一区二区| 91福利精品视频| 国产欧美一区二区精品忘忧草| 亚洲欧美日韩综合aⅴ视频| 免费人成黄页网站在线一区二区 | 亚洲免费视频成人| 国产在线播放一区三区四| 欧美精品在欧美一区二区少妇| 国产精品美女一区二区| 国产呦萝稀缺另类资源| 欧美一区二区人人喊爽| 一二三区精品福利视频| eeuss国产一区二区三区| 久久久久久免费| 国内精品国产成人| 91精品国产综合久久久久久| 樱桃视频在线观看一区| 99麻豆久久久国产精品免费优播| 国产日韩欧美激情| 高清不卡一区二区| 国产农村妇女毛片精品久久麻豆| 免费不卡在线观看| 91麻豆精品91久久久久同性| 五月激情综合网| 国产精品视频观看| 一本色道久久综合亚洲精品按摩| 18成人在线观看| 色综合色综合色综合色综合色综合 | 中文字幕制服丝袜一区二区三区 | 亚洲激情自拍视频| 2021久久国产精品不只是精品| 免费在线观看日韩欧美| 国产天堂亚洲国产碰碰| 91香蕉视频在线| 性欧美大战久久久久久久久| 欧美精品一区二区在线播放| 成人动漫一区二区| 亚洲精品高清视频在线观看| 在线播放91灌醉迷j高跟美女| 久久er99精品| 一区二区在线观看免费视频播放| 欧美日韩一区国产| 懂色一区二区三区免费观看| 一区二区三区日韩| 久久久久久久久久久久久久久99 | 亚洲美女视频在线| 欧美mv和日韩mv的网站| 在线影院国内精品| 国产一区在线观看麻豆| 亚洲国产日韩一区二区| 久久久久久久久久久电影| 欧美三级蜜桃2在线观看| 不卡电影一区二区三区| 看电影不卡的网站| 美女性感视频久久| 亚洲国产精品一区二区www | 成人伦理片在线| 国产伦精品一区二区三区免费| 亚洲国产精品自拍| 一区二区三区免费在线观看| 午夜a成v人精品| 亚洲一区二区三区四区五区黄| 国产精品久久777777| 欧美国产一区二区在线观看| 久久久久成人黄色影片| 日韩亚洲电影在线| 欧美成人伊人久久综合网| 欧美一级免费大片| 日韩欧美一二区| 日韩欧美三级在线| 久久久久99精品一区| 亚洲视频网在线直播| 亚洲精品国产精华液| 日韩影视精彩在线| 老司机免费视频一区二区三区| 日本不卡高清视频| 粗大黑人巨茎大战欧美成人| av欧美精品.com| 欧美美女bb生活片| 国产视频视频一区| 亚洲色大成网站www久久九九| 一区二区三区在线免费播放 | 欧美高清你懂得| 国产清纯白嫩初高生在线观看91 | 日韩欧美亚洲国产精品字幕久久久| 精品人在线二区三区| 国产精品69毛片高清亚洲| 国产大陆精品国产| 欧美中文字幕一区| 日韩欧美高清在线| 亚洲一区二区三区在线| 懂色av一区二区三区免费看| 精品视频在线免费观看| 欧美激情一区二区三区在线| 亚洲另类春色校园小说| 韩国视频一区二区| 欧美一区二区日韩| 亚洲地区一二三色|