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

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

?? gcc-howto-4.html

?? Linux初學者最好的老師就是howto了。相當于函數man。
?? HTML
?? 第 1 頁 / 共 2 頁
字號:
<!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="SGML-Tools 1.0.7">
 <TITLE>The Linux GCC HOWTO中譯版V0.2: 移植程式與編譯程式</TITLE>
 <LINK HREF="GCC-HOWTO-5.html" REL=next>
 <LINK HREF="GCC-HOWTO-3.html" REL=previous>
 <LINK HREF="GCC-HOWTO.html#toc4" REL=contents>
</HEAD>
<BODY>
<A HREF="GCC-HOWTO-5.html">Next</A>
<A HREF="GCC-HOWTO-3.html">Previous</A>
<A HREF="GCC-HOWTO.html#toc4">Contents</A>
<HR>
<H2><A NAME="s4">4. 移植程式與編譯程式</A></H2>

<H2><A NAME="index.25"></A> <A NAME="ss4.1">4.1 gcc自行定義的符號</A>
 </H2>

<P>只要執行gcc時,附加<CODE> -v</CODE>這個參數,就能找出你所用的這版gcc,自動幫你定義了什麼符號。例如,我的機器看起來會像這樣:
<P>
<BLOCKQUOTE><CODE>
<PRE>
$ echo 'main(){printf("hello world\n");}' | gcc -E -v -
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
 /usr/lib/gcc-lib/i486-box-linux/2.7.2/cpp -lang-c -v -undef
-D__GNUC__=2 -D__GNUC_MINOR__=7 -D__ELF__ -Dunix -Di386 -Dlinux
-D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__i386
-D__linux -Asystem(unix) -Asystem(posix) -Acpu(i386)
-Amachine(i386) -D__i486__ -
</PRE>
</CODE></BLOCKQUOTE>
<P>假若你正在寫的程式碼會用到一些Linux獨有的特性,那麼把那些無法移植的程式碼,以條件式編譯的前置命令封括起來,可是個不錯的主意呢!如下所示∶
<P>
<BLOCKQUOTE><CODE>
<PRE>
#ifdef __linux__
/* ... funky stuff ... */
#endif /* linux */
</PRE>
</CODE></BLOCKQUOTE>
<P>用<CODE>__linux__</CODE>就可以達成目的;看仔細一點,<EM>不是</EM><CODE>linux</CODE>喔。盡管<CODE>linux</CODE>也有定義,畢竟,這個仍然不是POSIX的標準。
<P>
<P>
<H2><A NAME="ss4.2">4.2 線上求助說明</A>
</H2>

<P> gcc編譯器參數的說明文件是gcc info page(在Emacs內,按下<CODE>C-h i</CODE>,然後選‘gcc’的選項)。要是弄不出來,不是賣你CD-ROM的人沒把這個東東壓給你,不然就是你現在用的是舊版的。遇到這種情況,最好的方法是移動尊臀到archive
<A HREF="ftp://prep.ai.mit.edu/pub/gnu">ftp://prep.ai.mit.edu/pub/gnu</A>或是它的mirrors站臺,去把gcc的原始檔案抓回家,重新烹飪一番。
<P>gcc manual page(<CODE>gcc.1</CODE>) 可以說是已經過時了,要是你吃飽了撐著沒事干硬是想看,它就會告訴你說別無聊了。
<P>
<H3><A NAME="index.27"></A> <A NAME="index.26"></A> 旗正飄飄&nbsp;  </H3>

<P> 在命令列上執行gcc時,只要在它的屁股後面加上<CODE>-O</CODE><EM>n</EM>的選項,就能讓gcc乖乖的替你生出最佳編碼的機器碼。這里的<EM>n</EM>是一個可有可無的小整數,不同版本的gcc,<EM>n</EM>的意義與其正確的功效都不一樣,不過,典型的□圍是從0(不要雞婆,我不要最佳編碼。)變化到2(最佳編碼要多一點。),再升級到3(最佳編碼要再多一點,多一點)。
<P>gcc在其內部會將這些數字轉譯成一系列的<CODE>-f</CODE>與<CODE>-m</CODE>的選項。執行gcc時帶上旗號<CODE>-v</CODE>與<CODE>-Q</CODE>,你就能很清楚的看出每一種等級的<CODE>-O</CODE>是對應到那些選項。好比說,就<CODE>-O2</CODE>來講,我的gcc告訴會我說:
<P>
<BLOCKQUOTE><CODE>
<PRE>
enabled: -fdefer-pop -fcse-follow-jumps -fcse-skip-blocks
-fexpensive-optimizations
         -fthread-jumps -fpeephole -fforce-mem -ffunction-cse -finline
         -fcaller-saves -fpcc-struct-return -frerun-cse-after-loop
         -fcommon -fgnu-linker -m80387 -mhard-float -mno-soft-float
         -mno-386 -m486 -mieee-fp -mfp-ret-in-387
</PRE>
</CODE></BLOCKQUOTE>
<P>要是你用的最佳編碼等級高於你的編譯器所能支援的(e.g. <CODE>-O6</CODE>),那麼它的效果就跟你用你的編譯器<EM>所能</EM>提供的最高等級的效果是一樣的。說實在的,發行出去的gcc程式碼,用在編譯時竟是如此處理這等問題,真的不是什麼好的構想。日後若是有更進步的最佳編碼方法具體整合到新的版本里,而你(或是你的users)還是試著這樣做的話,可能就會發現gcc會中斷你的程式了。
<P>
<A NAME="index.28"></A>  
從gcc 2.7.0升級到2.7.2的users應該注意一點,使用<CODE>-O2</CODE>時會有一個bug。更糟糕的是,強度折減參數(strength reduction)居然沒有用!要是你喜歡重新編譯gcc的話,是有那麼一個修正的版本可以更正這項錯誤;不然的話,一定要確定每次編譯時都有加上<CODE>-fno-strength-reduce</CODE>喔!
<P>11/12/97譯
<P>
<P>
<P>
<H3>有個性的微處理器</H3>

<P> 有一些<CODE>-m</CODE>的旗號十分有用處,但是卻無法藉由各種等級的<CODE>-O</CODE>打開來使用。這之中最重要的有是<CODE>-m386</CODE>和<CODE>-m486</CODE>這兩種,用來告訴gcc該把正在編譯的程式碼視作專為386或是486機器所寫的。不論是用哪一種<CODE>-m</CODE>來編譯程式碼,都可以在彼此的機器上執行,-m486編譯出來的碼會比較大,不過拿來在386的機器上跑也不會比較慢就是了。
<P>目前尚無<CODE>-mpentium</CODE>或是<CODE>-m586</CODE>的旗號。Linus建議我們可以用<CODE>-m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2</CODE>來得到最佳編碼的486程式碼,這樣做正好就可以避免alignment(Pentium并不需要)有過大的gaps發生。Michael Meissner說:
<P>
<BLOCKQUOTE>
我的第六感告訴我,<CODE>-mno-strength-reduce</CODE>(嘿!要曉得我可不是在談強度折減參數的bug呀,那已經是另外一個爭論的戰場了。)一樣也可以在x86的機器上產生較快的程式碼,這是因為x86的機器對暫存器有著不可磨滅的□渴在,而且GCC's method of grouping registers into spill registers vs. other registers doesn't help either。傳統上,強度折減的結果會使得編譯器去利用加法暫存器以加法運算來取代乘法運算。事實上,我在懷疑<CODE>-fcaller-saves</CODE>可能也只是個漏洞也說不定。
</BLOCKQUOTE>

<BLOCKQUOTE>
而我的第七感則再度的告訴我說,<CODE>-fomit-frame-pointer</CODE>可能會也可能不會有任何的賺頭。從這點來看,就是意謂著有另一個暫存器可以用來處理記憶體分配的問題。另方面,若純粹從x86的機器在轉換它的指令集成為機器碼的方法上來看,便意謂著堆疊所用到的記憶體空間要比frame所用到的還要來得多;換句話說,Icache對程式碼而言并沒有實質上的幫助,若是閣下用了<CODE>-fomit-frame-pointer</CODE>的話,同時也是告訴編譯器在每次呼叫函數之後,就必須修正堆疊的指標;然而,就frame來講,若呼叫的次數不多的話,則允許堆疊暫時堆積起來。
</BLOCKQUOTE>
<P>有關這方面主題的最後一段話仍是來自於Linus:
<P>
<BLOCKQUOTE>
要注意的是,如果你想要得到最佳狀況的執行效能,可千萬別相信我的話。無論如何,一定要進行測試。gcc編譯器還有許多的參數可用,其中可能就有一種最特別的組合,可以給你最佳編碼的結果。
</BLOCKQUOTE>
<P>11/14/97譯
5/15/98修正
<P>
<P>
<H3><A NAME="index.33"></A> <A NAME="index.32"></A> <A NAME="index.31"></A> <A NAME="index.30"></A> <A NAME="index.29"></A> <CODE>Internal compiler error: cc1 got fatal signal 11</CODE>     </H3>

<P> Signal 11是指 SIGSEGV,或者 ‘segmentation violation’。通常這是指
說gcc對自己所用的指標感到困惑,而且還嘗試著把資料寫入不屬於它的記憶體里。所以,這可能是一個gcc的bug。
然而,大體而言,gcc是一支經過嚴密測試且可靠度良好的軟體佳作。它也用了大量復雜的資料結構與驚人的指標數量。簡言之,若是要評選本世紀最挑惕與最一絲不□的RAM測試程式,gcc絕對可以一摘后冠。假如你<EM>無法重新復制這只bug</EM>---當你重新開始編譯時,錯誤的訊息并沒有一直出現在同一個地方---那幾乎可以確定,是你的硬體本身有問題(CPU,記憶體,主機板或是快取記憶體).<B>千萬不要</B>因為你的電腦可以通過開機程序的測試、或是Windows可以跑得很順、或者其它什麼的,就回過頭來大肆宣傳說這是gcc的一個bug;你所做的這些測試動作,通常沒有什麼實際上的價值,這是很合理的結論。另外,也不要因為編譯核心時,總是停留在‘<CODE>make zImage</CODE>’的階段,就要大罵這是gcc的bug---當然它會停在那兒?。∽觥?lt;CODE>make zImage</CODE>’時,需要編譯的檔案可能就超過200檔案;我們正在研擬一個替代的方案。
<P>
<P> 如果你可以重覆產生這個bug,而且(最好是這樣啦?。┛梢詫懸粋€短小的程式來展示這只bug的話,你就可以把它做成bug報告,然後email給FSF,或者是linux-gcc通信論壇。你可以去參考gcc的說明文件,看看有什麼詳細的資訊,是他們所需要的。
<P>
<P>
<H2><A NAME="ss4.3">4.3 移植能力</A>
</H2>

<P> 據報,近日來許多正面的消息指出,若是有某件東東到現在都還沒移植到Linux上去,那麼可以肯定的是,它一定一點價值也沒有。:-)
<P>嗯!正經一點。一般而言,原始碼只需要做一些局部的修改,就可以克服Linux 100%與POSIX相容的特質。如果你做了任何的修改,而將此部份傳回給原作者,會是很有建設性的舉動。這樣日後就只需要用到‘make’,就能得到一個可執行的檔案了。
<P>
<H3>BSD教徒 (有 <CODE>bsd_ioctl</CODE>、<CODE>daemon</CODE> 與 <CODE>&lt;sgtty.h&gt;</CODE>)</H3>

<P> 編譯程式時,可以配合<CODE>-I/usr/include/bsd</CODE>與連結<CODE>-lbsd</CODE>的程式庫。(例如:在你的Makefile檔內,把<CODE>-I/usr/include/bsd</CODE>加到<CODE>CFLAGS</CODE>那一行;把<CODE>-lbsd</CODE>加到<CODE>LDFLAGS</CODE>那一行)。如果你真的那麼想要BSD型態的信號行為,也<EM>不</EM>需要再加上<CODE>-D__USE_BSD_SIGNAL</CODE>了。那是因為當你用了<CODE>-I/usr/include/bsd</CODE>與含括了標頭檔<CODE>&lt;signal.h&gt;</CODE>之後,make時就會自動加入了。
<P>
<H3><A NAME="index.38"></A> <A NAME="index.37"></A> <A NAME="index.36"></A> <A NAME="index.35"></A> <A NAME="index.34"></A> 失落的封印(<CODE>SIGBUS</CODE>, <CODE>SIGEMT</CODE>, <CODE>SIGIOT</CODE>, <CODE>SIGTRAP</CODE>, <CODE>SIGSYS</CODE> etc)     </H3>

<P> Linux與POSIX是完全相容的。不過,有些信號并不是POSIX定義的---ISO/IEC 9945-1:1990 (IEEE Std 1003.1-1990), paragraph B.3.3.1.1 sez:
<P>
<BLOCKQUOTE>
“在POSIX.1中省略了SIGBUS、SIGEMT、SIGIOT、SIGTRAP與SIGSYS信號,那是因為它們的行為與實作的方式息息相關,而且也無法進行適當的分類。確認實作方式後,便可以發送這些信號,可是必須以文件說明它們是在什麼樣的環境底下發送出來的,以及指出任何與它們的發展相關的限制。”
</BLOCKQUOTE>
<P>
<P>想要修正這個問題,最簡單也是最笨的方法就是用<CODE>SIGUNUSED</CODE>重新定義這些信號。<EM>正確的</EM>方法應該是以條件式的編譯<CODE>#ifdef</CODE>來處理這些問題才對:
<P>
<BLOCKQUOTE><CODE>
<PRE>
#ifdef SIGSYS
/* ... non-posix SIGSYS code here .... */
#endif
</PRE>
</CODE></BLOCKQUOTE>
<P>11/15/97譯
5/22/98修正
<P>
<H3><A NAME="index.39"></A> K &amp; R  </H3>

<P>gcc是一個與ANSI相容的編譯器;奇怪的是,目前大多數的程式碼都不符合ANSI所定的標準。如果你熱愛ANSI,喜歡用ANSI提供的標準來撰寫C程式,似乎除了加上<CODE>-traditional</CODE>的旗號之外,就沒有其它什麼可以多談的了。There is a certain amount of finer-grained control over which varieties of brain damage to emulate;請自行查閱gcc info page。
<P>要注意的是,盡管你用了<CODE>-traditional</CODE>來改變語言的特性,它的效果也僅局限於gcc所能夠接受的□圍。例如, <CODE>-traditional</CODE>會打開<CODE>-fwritable-strings</CODE>,使得字串常數移至資料記憶體空間內(從程式碼記憶體空間移出來,這個地方是不能任意寫入的)。這樣做會讓程式碼的記憶體空間無形中增加的。
<P>
<H3><A NAME="index.41"></A> <A NAME="index.40"></A> 前置處理器的符號卯上函數原型宣告  </H3>

<P>最常見的問題是,如眾所皆知,Linux中有許多常用的函數都定義成巨集存放在標頭檔內,此時若有相似的函數原型宣告出現在程式碼內,前置處理器會拒絕進行語法分析的前置作業。常見的有<CODE>atoi()</CODE>與<CODE>atol()</CODE>。
<P>
<H3><A NAME="index.42"></A> <CODE>sprintf()</CODE> </H3>

<P>在大部份的Unix系統上,<CODE>sprintf(string, fmt, ...)</CODE>傳回的是<CODE>string</CODE>的指標,然而,這方面Linux(遵循ANSI)傳回的卻是放入string內的字元數目.進行移植時,尤其是針對SunOS,需有警覺的心。
<P>
<H3><A NAME="index.49"></A> <A NAME="index.48"></A> <A NAME="index.47"></A> <A NAME="index.46"></A> <A NAME="index.45"></A> <A NAME="index.44"></A> <A NAME="index.43"></A> <CODE>fcntl</CODE> 與相關的函數;<CODE>FD_*</CODE>家族的定義到底擺在哪里?       </H3>

<P>就在<CODE>&lt;sys/time.h&gt;</CODE>里頭。 為了真正的原型宣告,當你用了<CODE>fcntl</CODE>,可能你也想含括標頭檔<CODE>&lt;unistd.h&gt;</CODE>進來。
<P>一般而言,函數的manual page會在SYNOPSIS章節內列出需要的<CODE>標頭檔</CODE>。
<P>
<P>
<H3><A NAME="index.50"></A> <CODE>select()</CODE>的計時---程式執行時會處於忙碌-等待的狀態 </H3>

<P>很久很久以前,,<CODE>select()</CODE>的計時參數只有唯讀的性而已。即使到了最近,manual pages仍然有下面這段的警告:
<P>
<BLOCKQUOTE>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区在线免费观看| 亚洲国产精品成人久久综合一区| 亚洲日穴在线视频| 99久久婷婷国产综合精品电影 | 亚洲线精品一区二区三区| 99久久精品国产一区| 亚洲天堂免费看| 欧美三级日韩三级国产三级| 日韩制服丝袜先锋影音| 欧美一区二区私人影院日本| 免费成人在线观看| 精品国产成人在线影院| 国产高清精品久久久久| 一区在线中文字幕| 色久优优欧美色久优优| 日韩综合一区二区| 国产色一区二区| 91久久一区二区| 日韩电影在线一区| 精品国产青草久久久久福利| 风间由美性色一区二区三区| 亚洲免费视频成人| 欧美日本国产一区| 高清在线成人网| 一区二区三区91| 精品久久久久久亚洲综合网| 成人av免费在线| 日韩电影在线观看电影| 久久精品在这里| 欧美日韩免费不卡视频一区二区三区| 蜜桃视频免费观看一区| 欧美经典一区二区| 欧美精品久久一区| 成人激情午夜影院| 日日夜夜免费精品视频| 日本一区二区不卡视频| 欧美精品久久天天躁| 成人午夜在线视频| 青青草原综合久久大伊人精品| 中文字幕欧美三区| 日韩免费福利电影在线观看| av爱爱亚洲一区| 久久99精品国产麻豆婷婷| 亚洲蜜桃精久久久久久久| 久久影院午夜论| 欧美三区在线观看| 成人久久久精品乱码一区二区三区| 亚洲电影一区二区三区| 国产日产欧美一区| 日韩一区二区三区四区| 日本久久一区二区| 成人看片黄a免费看在线| 久久99精品国产麻豆婷婷洗澡| 一区二区三区日韩欧美精品 | 国产精品一区二区不卡| 午夜精品久久一牛影视| 亚洲视频网在线直播| 26uuu成人网一区二区三区| 欧美三级视频在线| 色综合亚洲欧洲| 国产成人午夜精品5599| 免费av成人在线| 一区二区三区美女| 日韩伦理免费电影| 日本一区二区成人| 中文字幕欧美区| 久久久久久久网| 精品久久久三级丝袜| 欧美一级生活片| 91精品中文字幕一区二区三区| 色婷婷综合久久久中文字幕| 国产a精品视频| 国产成人午夜视频| 国产成人精品免费| 成人污视频在线观看| 国产一区二区导航在线播放| 九一久久久久久| 麻豆91免费看| 国内不卡的二区三区中文字幕| 欧美aaaaa成人免费观看视频| 三级欧美在线一区| 久久精品国产免费看久久精品| 日韩国产欧美视频| 美女一区二区视频| 蜜桃久久精品一区二区| 韩日欧美一区二区三区| 国产一区在线看| 国产精品资源站在线| 风间由美一区二区av101| 欧美日韩一区二区三区在线| 在线精品视频小说1| 欧美在线综合视频| 欧美丰满嫩嫩电影| 欧美mv日韩mv亚洲| 久久久精品国产免费观看同学| 久久精品亚洲一区二区三区浴池| 欧美精品一区二区三区四区| 国产午夜精品一区二区| 1024成人网| 亚洲高清三级视频| 麻豆精品视频在线观看| 99精品国产91久久久久久| zzijzzij亚洲日本少妇熟睡| 色婷婷av一区二区三区软件 | 国产91丝袜在线播放九色| 国产成人亚洲综合a∨婷婷图片| www.亚洲在线| 欧美日韩一区二区电影| 欧美r级在线观看| 中文字幕中文乱码欧美一区二区| 一区二区三区美女视频| 久久av中文字幕片| 99久久综合色| 欧美美女激情18p| 久久嫩草精品久久久精品一| 国产精品久久久久久亚洲伦| 亚洲成人在线观看视频| 精品亚洲免费视频| 91麻豆高清视频| 日韩一区二区三区电影在线观看 | 中文字幕色av一区二区三区| 亚洲第一成年网| 国产麻豆精品久久一二三| 欧亚一区二区三区| 久久久久久9999| 亚洲在线观看免费视频| 国产一区激情在线| 欧美精品日韩综合在线| 亚洲欧洲日韩女同| 精品一区二区三区在线观看国产| 99视频超级精品| 欧美不卡在线视频| 亚洲国产精品久久久久婷婷884 | 在线观看一区日韩| 久久久777精品电影网影网| 亚洲国产精品天堂| 成人福利视频在线看| 精品99久久久久久| 亚洲午夜视频在线| aaa欧美色吧激情视频| 欧美电影免费提供在线观看| 一区二区三区电影在线播| 国产福利精品一区| 欧美成人a视频| 日韩av在线播放中文字幕| 在线看不卡av| 亚洲精品一二三| av亚洲精华国产精华| 国产亚洲欧美日韩在线一区| 日韩成人一级片| 欧美性色aⅴ视频一区日韩精品| 国产精品色在线| 国产福利视频一区二区三区| 精品国产乱码久久久久久久| 香蕉成人啪国产精品视频综合网| aaa亚洲精品| 日韩理论在线观看| av爱爱亚洲一区| 欧美国产97人人爽人人喊| 激情av综合网| 国产精品免费视频一区| 精品一区在线看| 日韩一区二区三区精品视频| 天天射综合影视| 欧美午夜精品一区二区蜜桃 | 亚洲国产精品一区二区久久| 91网站视频在线观看| 国产精品久久久久久久久免费丝袜| 久久99精品视频| 久久综合色播五月| 国产激情一区二区三区四区| 日韩欧美国产综合一区| 日本不卡一区二区| 欧美一区二区三区爱爱| 日韩不卡一区二区| 日韩美女主播在线视频一区二区三区| 亚洲国产视频一区二区| 777xxx欧美| 久久99精品久久久久久国产越南 | 午夜一区二区三区视频| 欧美日韩精品高清| 亚洲第四色夜色| 日韩一区和二区| 国产久卡久卡久卡久卡视频精品| 日韩精品在线网站| 国产成人aaaa| 国产精品欧美综合在线| 7777精品伊人久久久大香线蕉的| 午夜精品免费在线观看| 欧美高清视频一二三区| 蜜臀av在线播放一区二区三区| 精品久久久久一区二区国产| 国产乱理伦片在线观看夜一区| 国产精品毛片久久久久久久| 99久久99久久免费精品蜜臀| 一区二区三区在线免费视频| 欧美在线视频不卡| 精品一区二区免费视频| 亚洲国产成人在线| 欧美日韩亚洲丝袜制服|