亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
欧美日韩高清一区二区不卡| 日韩电影免费在线| 精品久久国产老人久久综合| 欧美日本一区二区三区四区| 欧美色网站导航| 欧美日韩国产精品成人| 欧美日韩亚洲高清一区二区| 欧美日韩一区国产| 欧美一区二区三区视频免费| 91麻豆精品国产91久久久久久| 欧美视频一区二区在线观看| 在线观看一区二区视频| 欧美色手机在线观看| 欧美一级理论性理论a| 精品美女一区二区三区| 欧美精品一区二区久久婷婷| 久久女同精品一区二区| 中文av一区二区| 中文字幕一区二区三区蜜月| 亚洲一区二区视频在线观看| 亚洲五码中文字幕| 看片的网站亚洲| 国产福利不卡视频| 成人av免费在线观看| 欧美三级在线播放| 精品国产成人系列| 欧美极品少妇xxxxⅹ高跟鞋 | 99久久99久久久精品齐齐| 国产91精品一区二区麻豆网站| 暴力调教一区二区三区| 欧美在线观看视频一区二区| 日韩欧美一级特黄在线播放| 国产欧美日韩三区| 一区二区三区四区乱视频| 日韩经典中文字幕一区| 国产成人精品网址| 欧美羞羞免费网站| 国产午夜亚洲精品羞羞网站| 亚洲男人天堂av网| 韩国av一区二区| 91麻豆精品在线观看| 欧美成人bangbros| 亚洲三级理论片| 国模少妇一区二区三区| 色狠狠av一区二区三区| 欧美精品乱码久久久久久 | 91一区二区在线| 欧美一区二区三区在线观看| 日本一区二区电影| 青青青爽久久午夜综合久久午夜| 成人国产精品免费观看动漫| 日韩欧美在线1卡| 一区二区在线观看免费| 国产麻豆9l精品三级站| 91麻豆精品国产91| 亚洲色图视频网| 成人在线综合网| 日韩视频一区二区在线观看| 亚洲一区电影777| zzijzzij亚洲日本少妇熟睡| xnxx国产精品| 日韩av一级片| 欧美日韩一区二区三区在线| 亚洲欧美一区二区在线观看| 国产麻豆精品视频| 日韩精品一区二区三区中文不卡| 亚洲国产成人高清精品| 色屁屁一区二区| 亚洲视频狠狠干| av男人天堂一区| 亚洲欧美怡红院| 99久久国产综合精品麻豆| 国产精品美女久久久久aⅴ| 国产美女精品在线| 久久―日本道色综合久久| 美女一区二区在线观看| 日韩一区二区三区免费看| 亚洲a一区二区| 欧美视频在线播放| 亚洲国产一区二区三区青草影视 | 黄页视频在线91| 欧美大胆人体bbbb| 麻豆极品一区二区三区| 精品久久久久久无| 国产乱码字幕精品高清av | 国产成人在线免费观看| 欧美va在线播放| 国产一区三区三区| 欧美极品美女视频| 91麻豆自制传媒国产之光| 亚洲精品视频在线看| 色婷婷国产精品| 一区二区免费看| 制服丝袜av成人在线看| 精品无码三级在线观看视频| 久久久久久久久久看片| 99re这里只有精品首页| 一区二区三区四区不卡在线| 5858s免费视频成人| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产清纯美女被跳蛋高潮一区二区久久w | 久久蜜桃av一区二区天堂| 国产sm精品调教视频网站| 综合自拍亚洲综合图不卡区| 日本电影亚洲天堂一区| 麻豆精品国产91久久久久久 | 在线一区二区三区四区五区 | 国产69精品久久久久毛片| 国产欧美精品在线观看| 欧美日韩一区视频| 国内精品免费在线观看| 一区二区在线观看免费视频播放| 欧美精品日韩综合在线| 东方aⅴ免费观看久久av| 亚洲黄色免费网站| 2024国产精品视频| 91豆麻精品91久久久久久| 麻豆精品在线播放| 亚洲天堂久久久久久久| 欧美tk—视频vk| 99视频一区二区三区| 蜜桃视频在线一区| 亚洲色图一区二区| 26uuu亚洲| 欧美日韩在线亚洲一区蜜芽| 成人高清在线视频| 麻豆精品精品国产自在97香蕉| 亚洲麻豆国产自偷在线| 亚洲精品一区二区三区香蕉| 色老综合老女人久久久| 成人黄页毛片网站| 久久99热国产| 五月婷婷久久综合| 亚洲天堂网中文字| 欧美国产综合一区二区| 日韩一二三四区| 欧美高清视频在线高清观看mv色露露十八| 精品一区二区免费看| 日韩av一区二| 婷婷久久综合九色国产成人| 亚洲免费看黄网站| 国产精品午夜在线观看| 2021中文字幕一区亚洲| 91精品在线麻豆| 欧美日韩一级片在线观看| 91国偷自产一区二区开放时间 | 欧美羞羞免费网站| 一本色道久久加勒比精品 | 久久精品噜噜噜成人av农村| 亚洲成人一二三| 亚洲欧美激情小说另类| 亚洲日本在线天堂| 中文字幕一区日韩精品欧美| 国产精品久久久久影院亚瑟| 国产欧美日韩一区二区三区在线观看| 26uuu欧美日本| 国产调教视频一区| 国产精品超碰97尤物18| 国产精品久久久久久久久晋中| 久久精子c满五个校花| 国产清纯白嫩初高生在线观看91| 久久视频一区二区| 国产精品美女一区二区三区| 国产精品色婷婷久久58| 亚洲三级在线观看| 亚洲电影第三页| 日本少妇一区二区| 久久精品国产精品青草| 国产精品一二三区| 成人av在线资源| 色婷婷综合久久久久中文一区二区 | 舔着乳尖日韩一区| 日韩黄色免费电影| 国产福利一区二区三区视频| 成人av在线播放网址| 日本韩国欧美一区二区三区| 欧美剧情电影在线观看完整版免费励志电影| 欧美亚洲日本一区| 精品理论电影在线| 国产精品色婷婷| 日韩二区三区在线观看| 久久精品国产亚洲a| 成人av在线资源网| 在线观看欧美黄色| 久久综合九色综合97_久久久| 国产精品美女一区二区| 日韩精品亚洲专区| 国产福利91精品一区二区三区| 91美女在线视频| 久久久久久久久久美女| 亚洲午夜一二三区视频| 国产一区二区精品久久99| 91福利国产精品| 国产日韩欧美不卡| 日韩国产一区二| 豆国产96在线|亚洲| 日韩精品自拍偷拍| 亚洲综合色成人| 国产福利一区在线观看| 欧美一级黄色录像|