?? 8.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"> <META NAME="GENERATOR" CONTENT="《良友》v2.1, 作者:安富國,http://winking.126.com"> <TITLE>gcc</TITLE></HEAD><BODY style="font-family: 宋體; font-size: 9pt"> <CENTER><TABLE CELLSPACING=10 CELLPADDING=10 WIDTH="60%" BGCOLOR="#FFB693" ><TR><TD ALIGN=CENTER><FONT SIZE=+2><!--標(biāo)題由此開始-->gcc</TD></TR></TABLE></CENTER><p><h3>目 錄</h3><!--目錄由此開始--><A NAME="Content" ID="Content"></A><OL><LI><A HREF="#I194">gcc</A></LI><OL><LI><A HREF="#I195">makefile寫法</A></LI><LI><A HREF="#I196">gcc_egcs使用</A></LI><LI><A HREF="#I197">gdb使用</A></LI><LI><A HREF="#I198">gcc常用選項(xiàng)對代碼的影響</A></LI><OL><LI><A HREF="#I199">一般情況</A></LI><LI><A HREF="#I200">-O 編譯選項(xiàng)</A></LI><LI><A HREF="#I201">-O2 編譯選項(xiàng)</A></LI><LI><A HREF="#I202">-fomit-frame-pointer 編譯選項(xiàng)</A></LI><LI><A HREF="#I203">-fomit-frame-pointer && -O2</A></LI><LI><A HREF="#I204">-fPIC 編譯選項(xiàng)</A></LI><LI><A HREF="#I205">-static 編譯選項(xiàng)</A></LI></OL><LI><A HREF="#I206">AT&T的匯編格式</A></LI><LI><A HREF="#I207">x86內(nèi)聯(lián)匯編</A></LI><OL><LI><A HREF="#I208">簡述</A></LI><LI><A HREF="#I209">內(nèi)聯(lián)匯編</A></LI><LI><A HREF="#I210">程序模板</A></LI><LI><A HREF="#I211">操作數(shù)</A></LI><LI><A HREF="#I212">修飾寄存器列表</A></LI><LI><A HREF="#I213">操作數(shù)約束</A></LI><LI><A HREF="#I214">示例</A></LI><OL><LI><A HREF="#I215">寄存器約束</A></LI><LI><A HREF="#I216">匹配約束</A></LI><LI><A HREF="#I217">內(nèi)存操作數(shù)約束</A></LI><LI><A HREF="#I218">修飾寄存器</A></LI></OL></OL><LI><A HREF="#I219">不同的CPU下最佳編譯參數(shù)</A></LI><LI><A HREF="#I343">代碼維護(hù)</A></LI><OL><LI><A HREF="#I344">簡單cvs</A></LI><LI><A HREF="#I345">automake</A></LI><LI><A HREF="#I346">diff</A></LI><LI><A HREF="#I347">rcs</A></LI><LI><A HREF="#I732">內(nèi)核重編譯常見故障</A></LI><LI><A HREF="#I348">cvs</A></LI><LI><A HREF="#I349">共享庫工具</A></LI><LI><A HREF="#I350">代碼優(yōu)化</A></LI><LI><A HREF="#I351">GNU 編碼標(biāo)準(zhǔn)</A></LI><LI><A HREF="#I352">書籍</A></LI></OL></OL></OL><hr><br><A NAME="I194" ID="I194"></A><center><b><font size=+2>gcc</font></b></center><br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I195" ID="I195"></A><center><b><font size=+2>makefile寫法</font></b></center><br>藍(lán)森林 http://www.lslnet.com 2001年3月22日 08:44<p>作 者: 許明彥<p>Abstract:<p> 在 Unix 上寫程式的人大概都碰過 Makefile,尤其是用 C 來開發(fā)程式的人。用 make來開發(fā)和編譯程式的確很方便,可是要寫出一個 Makefile就不簡單了。偏偏介紹 Makefile 的文件不多,GNU Make 那份印出來要幾百頁的文件,光看完 Overview 就快陣亡了,難怪許多<br>人聞 Unix 色變。<p> 本文將介紹如何利用 GNU Autoconf 及 Automake 這兩套軟體來協(xié)助我們『自動』產(chǎn)生 Makefile 檔,并且讓開發(fā)出來的軟體可以像 Apache, MySQL 和常見的 GNU 軟體一樣,只要會 ``./configure'', ``make'', ``make install'' 就可以把程式安裝到系統(tǒng)中。如果您有<br>心開發(fā) Open Source 的軟體,或只是想在 Unix 系統(tǒng)下寫寫程式。希望這份介紹文件能幫助您輕松地進(jìn)入 Unix Programming 的殿堂。<p>1. 簡介<p> Makefile 基本上就是『目標(biāo)』(target), 『關(guān)連』(dependencies) 和『動作』三者所組成的一連串規(guī)則。而 make 就會根據(jù) Makefile 的規(guī)則來決定如何編譯 (compile) 和連結(jié) (link) 程式。實(shí)際上,make 可做的不只是編譯和連結(jié)程式,例如 FreeBSD 的 port collect<br>ion 中, Makefile 還可以做到自動下載原始程式套件,解壓縮 (extract) ,修補(bǔ) (patch),設(shè)定,然後編譯,安裝至系統(tǒng)中。<p> Makefile 基本構(gòu)造雖然簡單,但是妥善運(yùn)用這些規(guī)則就也可以變出許多不同的花招。卻也因此,許多剛開始學(xué)習(xí)寫 Makefile 時會感到?jīng)]有規(guī)范可循,每個人寫出來的 Makefile 長得都不太一樣,不知道從何下手,而且常常會受限於自己的開發(fā)環(huán)境,只要環(huán)境變數(shù)不同或路<br>徑改一下,可能Makefile 就得跟著修改。雖然有 GNU Makefile Conventions (GNU Makefile 慣例) 訂出一些使用 GNU 程式設(shè)計(jì)時撰寫 Makefile 的一些標(biāo)準(zhǔn)和規(guī)范,但是內(nèi)容很長而且很復(fù)雜, 并且經(jīng)常做些調(diào)整,為了減輕程式設(shè)計(jì)師維護(hù) Makefile 的負(fù)擔(dān),因此有了Automake。<p> 程式設(shè)計(jì)師只需寫一些預(yù)先定義好的巨集 (macro),交給 Automake 處理後會產(chǎn)生一個可供Autoconf 使用的 Makefile.in 檔。再配合利用Autoconf 產(chǎn)生的自動設(shè)定檔 configure即可產(chǎn)生一份符合 GNU Makefile慣例的 Makeifle 了。<p>2. 上路之前<p> 在開始試著用 Automake 之前,請先確認(rèn)你的系統(tǒng)已經(jīng)安裝以下的軟體:<br>1. GNU Automake<br>2. GNU Autoconf<br>3. GNU m4<br>4. perl<br>5. GNU Libtool (如果你需要產(chǎn)生 shared library)<p> 我會建議你最好也使用 GNU C/C++ 編譯器 、GNU Make 以及其它 GNU 的工具程式來做為開發(fā)的環(huán)境,這些工具都是屬於 Open Source Software不僅免費(fèi)而且功能強(qiáng)大。如果你是使用Red Hat Linux 可以找到所有上述軟體的 rpm 檔,F(xiàn)reeBSD 也有現(xiàn)成的 package 可以直<br>接安裝,或著你也可以自行下載這些軟體的原始檔回來 DIY。以下的范例是在 Red Hat Linux 5.2 + CLE2 的環(huán)境下所完成的。<p>3. 一個簡單的例子<p> Automake 所產(chǎn)生的 Makefile 除了可以做到程式的編譯和連結(jié),也已經(jīng)把如何產(chǎn)生程式文件(如 manual page, info 檔及 dvi 檔) 的動作,還有把原始程式包裝起來以供散 的動作都考慮進(jìn)去了,所以原始程式所存放的目錄架構(gòu)最好符合 GNU 的標(biāo)準(zhǔn)慣例,接下來我拿hello.c 來做為例子。<p> 在工作目錄下建立一個新的子目錄 ``devel'',再在 devel 下建立一個``hello'' 的子目錄,這個目錄將作為我們存放 hello 這個程式及其相關(guān)檔案的地方:<p>% mkdir devel<br>% cd devel<br>% mkdir hello<br>% cd hello<p>用編輯器寫個 hello.c 檔,<br>#include stdio.h<br>int main(int argc, char** argv)<br>{<br>printf(``Hello, GNU! '');<br>return 0;<br>}<p> 接下來就要用 Autoconf 及 Automake 來幫我們產(chǎn)生 Makefile 檔了,<p>1. 用 autoscan 產(chǎn)生一個 configure.in 的雛型,執(zhí)行 autoscan 後會產(chǎn)生一個configure.scan 的檔案,我們可以用它做為configure.in檔的藍(lán)本。<p>% autoscan<br>% ls<br>configure.scan hello.c<p>2. 編輯 configure.scan 檔,如下所示,并且把它的檔名改成configure.in<br>dnl Process this file with autoconf to produce a con figure script.<br>AC_INIT(hello.c)<br>AM_INIT_AUTOMAKE(hello, 1.0)<br>dnl Checks for programs.<br>AC_PROG_CC<br>dnl Checks for libraries.<br>dnl Checks for header files.<br>dnl Checks for typedefs, structures, and compiler ch aracteristics.<br>dnl Checks for library functions.<br>AC_OUTPUT(Makefile)<p>3. 執(zhí)行 aclocal 和 autoconf ,分別會產(chǎn)生 aclocal.m4 及 configure 兩個檔案<br>% aclocal<br>% autoconf<br>% ls<br>aclocal.m4 configure configure.in hello.c<p>4. 編輯 Makefile.am 檔,內(nèi)容如下<br>AUTOMAKE_OPTIONS= foreign<br>bin_PROGRAMS= hello<br>hello_SOURCES= hello.c<p>5. 執(zhí)行 automake --add-missing ,Automake 會根據(jù) Makefile.am 檔產(chǎn)生一些檔案,包含最重要的 Makefile.in<br>% automake --add-missing<br>automake: configure.in: installing `./install-sh'<br>automake: configure.in: installing `./mkinstalldirs'<br>automake: configure.in: installing `./missing'<p>6. 最後執(zhí)行 ./configure ,<br>% ./configure<br>creating cache ./config.cache<br>checking for a BSD compatible install... /usr/bin/in stall -c<br>checking whether build environment is sane... yes<br>checking whether make sets ${MAKE}... yes<br>checking for working aclocal... found<br>checking for working autoconf... found<br>checking for working automake... found<br>checking for working autoheader... found<br>checking for working makeinfo... found<br>checking for gcc... gcc<br>checking whether the C compiler (gcc ) works... yes<br>checking whether the C compiler (gcc ) is a cross-co mpiler... no<br>checking whether we are using GNU C... yes<br>checking whether gcc accepts -g... yes<br>updating cache ./config.cache<br>creating ./config.status<br>creating Makefile<p> 現(xiàn)在你的目錄下已經(jīng)產(chǎn)生了一個 Makefile 檔,下個 ``make'' 指令就可以開始編譯 hello.c 成執(zhí)行檔,執(zhí)行 ./hello 和 GNU 打聲招呼吧!<p>% make<br>gcc -DPACKAGE="hello" -DVERSION="1.0" -I. -I. -g -O2 -c he llo.c<br>gcc -g -O2 -o hello hello.o<br>% ./hello<br>Hello! GNU!<p> 你還可以試試 ``make clean'',''make install'',''make dist'' 看看會有什麼結(jié)果。你也可以把產(chǎn)生出來的 Makefile 秀給你的老板,讓他從此對你刮目相看 :-)<p>4. 一探究竟<p> 上述產(chǎn)生 Makefile 的過程和以往自行編寫的方式非常不一樣,舍棄傳統(tǒng)自行定義 make 的規(guī)則,使用 Automake 只需用到一些已經(jīng)定義好的巨集即可。我們把巨集及目標(biāo) (target)寫在 Makefile.am 檔內(nèi),Automake讀入 Makefile.am 檔後會把這一串已經(jīng)定義好的巨集展<br>開并且產(chǎn)生對應(yīng)的Makefile.in 檔, 然後再由 configure 這個 shell script 根據(jù)Makefile.in 產(chǎn)生適合的 Makefile。<br> 在此范例中可藉由 Autoconf 及 Automake 工具所產(chǎn)生的檔案有 configure.scan、aclocal.m4、configure、Makefile.in,需要我們加入設(shè)定者為 configure.in 及 Makefile.am。<p>4.1 編輯 configure.in 檔<p> Autoconf 是用來產(chǎn)生 'configure' 檔的工具。'configure' 是一個shell script,它可以自動設(shè)定原始程式以符合各種不同平臺上 Unix 系統(tǒng)的特性,并且根據(jù)系統(tǒng)叁數(shù)及環(huán)境產(chǎn)生合適的 Makefile 檔或是C 的標(biāo)頭檔 (header file),讓原始程式可以很方便地在這些不同<br>的平臺上被編譯出來。Autoconf 會讀取 configure.in 檔然後產(chǎn)生 'configure' 這個shell script。<p> configure.in 檔的內(nèi)容是一連串 GNU m4 的巨集,這些巨集經(jīng)過autoconf 處理後會變成檢查系統(tǒng)特徵的 shell script。configure.in 內(nèi)巨集的順序并沒有特別的規(guī)定,但是每一個 configure.in 檔必須在所有巨集前加入 AC_INIT 巨集,然後在所有巨集的最後面加上 AC<br>_OUTPUT 巨集。我們可先用 autoscan 掃描原始檔以產(chǎn)生一個 configure.scan 檔,再對 configure.scan 做些修改成 configure.in 檔。在范例中所用到的巨集如下:<p>dnl<br> 這個巨集後面的字不會被處理,可視為注解。<p>AC_INIT(FILE)<br> 這個巨集用來檢查原始碼所在的路徑,autoscan 會自動產(chǎn)生,我們不必修改它。<p>AM_INIT_AUTOMAKE(PACKAGE,VERSION)<br> 這是使用 Automake 所必備的巨集,PACKAGE 是我們所要產(chǎn)生軟體套件的名稱,VERSION 是版本編號。<p>AC_PROG_CC<br> 檢查系統(tǒng)可用的 C 編譯器,如果原始程式是用 C 寫的就需要這個巨集。<p>AC_OUTPUT(FILE)<br> 設(shè)定 configure 所要產(chǎn)生的檔案,如果是 Makefile 的話,configure 便會把它檢查出來的結(jié)果帶入 Makefile.in 檔然後產(chǎn)生<br>合適的 Makefile。<p> 實(shí)際上,我們使用 Automake 時,還須要一些其它的巨集,這些額外的巨集我們用 aclocal來幫我們產(chǎn)生。執(zhí)行 aclocal 會產(chǎn)生 aclocal.m4檔,如果沒有特別的用途,我們可以不必修改它,用 aclocal 所產(chǎn)生的巨集會告訴 Automake 怎麼做。<p> 有了 configure.in 及 aclocal.m4 兩個檔案後,便可以執(zhí)行 autoconf來產(chǎn)生 configure檔了。<p>4.2 編輯 Makefile.am 檔<p> 接下來我們要編輯 Makefile.am 檔,Automake 會根據(jù) configure.in 中的巨集把Makefile.am 轉(zhuǎn)成 Makefile.in 檔。Makefile.am 檔定義我們所要產(chǎn)的目標(biāo):<p>AUTOMAKE_OPTIONS<br> 設(shè)定 automake 的選項(xiàng)。Automake 主要是幫助開發(fā) GNU 軟體的人員維護(hù)軟體套件,所以在執(zhí)行 automake 時,會檢查目錄下是否存在標(biāo)準(zhǔn) GNU 軟體套件中應(yīng)具備的文件檔案,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件檔。設(shè)成 foreign 時,automake 會改用一般軟<br>體套件的標(biāo)準(zhǔn)來檢查。<p>bin_PROGRAMS<br> 定義我們所要產(chǎn)生的執(zhí)行檔檔名。如果要產(chǎn)生多個執(zhí)行檔,每個檔名用空白字元隔開。<p>hello_SOURCES<br> 定義 'hello' 這個執(zhí)行檔所需要的原始檔。如果 'hello' 這個程式是由多個原始檔所產(chǎn)生,必須把它所用到的原始檔都列出來,以空白字元隔開。假設(shè) 'hello' 這個程式需要 'hello.c'、'main.c'、<p>'hello.h'<br>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -