• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            網(wǎng)絡(luò)服務(wù)器軟件開發(fā)/中間件開發(fā),關(guān)注ACE/ICE/boost

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks
             
              · 閆健勇·CPCW
              
                當前,雖然Linux還不很普及,在Linux下編寫和編譯程序的人不多。但是我相信,隨著Linux性能的不斷提升和逐漸普及,會有許多自由軟件出現(xiàn),也會有許多人成為Linux下的程序員。我結(jié)合自己的經(jīng)驗,介紹一下Linux下編寫和編譯程序所要注意的幾個問題,奉獻給希望為Linux的發(fā)展作出貢獻的人們。
              
              
              Linux下怎樣編譯程序?
              
              大多數(shù)Linux程序都是由C語言編寫的并由GNU C編譯而成。現(xiàn)在GCC是各種發(fā)行套件的一部分。有關(guān)最新GCC編譯器的版本、文章和補丁請看ftp://ftp.gnu.org/pub/gnu/。
              
              由C++編寫的程序必須由GNU C++編譯,GNU C++也是各種發(fā)行套件的一部分,在以上網(wǎng)址也有最新版本和補丁。
              
              編譯2.0.x的內(nèi)核需要2.7.2.x版本的GCC,如用象GCC 2.8.x, EGCS, or PGCC別的編譯器編譯內(nèi)核可能產(chǎn)生不可預想的后果。
              
              
              怎樣移植其它Unix程序到Linux上?
              
              總得來說,Unix上的程序不需要做改動,只要簡單的按照提示就可以移植到Linux上,如果安裝過程中出現(xiàn)錯誤信息,而你又不知道怎么處理,你可以猜或略去,不過這樣產(chǎn)生的程序往往帶有bug。所以最好還是問一下有經(jīng)驗的人。
              
              如果要從BSD-ish移植程序,試一試在編譯時加上-I/usr/include/bsd 和 ?lbsd命令。
              
              
              什么是ld.so,從哪可以找到它?
              
              ld.so是動態(tài)函數(shù)庫裝載器。過去,使用共享函數(shù)庫的程序在原代碼開頭使用約3K的空間來尋找和加載共享函數(shù)庫,現(xiàn)在,這段代碼被加進了一個特殊共享函數(shù)庫/lib/ld.so,所有的程序都可以使用該共享庫,這樣就節(jié)省了磁盤空間,而且升級方便。
              
              ld.so可以從以下網(wǎng)址得到tsx-11.mit.edu/pub/linux/packages/GCC/。
              
              
              怎樣升級庫函數(shù)而不使系統(tǒng)崩潰?
              
              注意:進行此操作應該養(yǎng)成做備份的習慣,因為這項操作很容易出錯。
              
              如果你升級象libc4這樣的老函數(shù)庫,這個過程會變得非常困難。而且你應該在該系統(tǒng)上讓libc4和libc5共存,因為,有些老程序還需要它。升級libc5也一樣。
              
              升級動態(tài)庫的問題常出現(xiàn)在當你移走老的函數(shù)庫時,用來升級的程序也運行不了了。有許多方法可以解決這個問題。一個方法就是暫時備份一下運行程序所需函數(shù)庫,它們一般在/lib/、/usr/lib/、 /usr/local/lib/、或其它的地方,在文件/etc/ld.so.conf中都有詳細記錄。
              
              例如,當你升級libc5時,目錄/lib/中有如下文件
              
              libc.so.5
              
              libc.so.5.4.33
              
              libm.so.5
              
              libm.so.5.0.9
              
              這些是C函數(shù)庫和數(shù)學庫,拷貝它們到文件/etc/ld.so.conf中含有的其它的目錄,如/usr/lib/中:
              
              cp -df /lib/libc.so.5* /usr/lib/
              
              cp -df /lib/libm.so.5* /usr/lib/
              
              ldconfig
              
              一定要記住運行l(wèi)dconfig來升級函數(shù)庫的配置文件。
              
              文件libc.so.5 和 libm.so.5是實際庫文件的鏈接文件,當你升級的時候,如果老的鏈接文件存在,新的鏈接不會產(chǎn)生,除非你使用CP命令的-f選項。CP的-d選項只復制鏈接文件,不復制原文件。
              
              如果你需要直接覆蓋鏈接,使用ln命令的選項-f。
              
              例如,拷貝新的庫函數(shù)覆蓋舊的。先對新的函數(shù)庫做一個鏈接,然后把函數(shù)庫和鏈接一起拷貝到/lib/中,命令如下:
              
              ln -sf ./libm.so.5.0.48 libm.so.5
              
              ln -sf ./libc.so.5.0.48 libc.so.5
              
              cp -df libm.so.5* /lib
              
              cp -df libc.so.5* /lib
              
              重申一下,拷貝完別忘記運行l(wèi)dconfig.
              
              如果一切工作順利的話,你可以刪除老的函數(shù)庫的備份。
              
              
              我能否把在486上編譯的代碼或編譯器拿到386上用?
              
              當然,除非你編譯的是內(nèi)核。
              
              GCC用來在486上編譯的選項-m486 只是優(yōu)化了所編譯程序,使其運行快一些。這些編譯的程序仍能很好的在386上運行,只是效果差一些。
              
              然而,從內(nèi)核1.3.35以后,采用486或Pentium選項編譯的內(nèi)核不能用于386的機器。
              
              GCC可以針對386和486進行配置。兩者區(qū)別在于,針對386配置的GCC把-m386作為缺省選項,而針對486配置的GCC把-m486作為缺省選項,僅此而已。
              
              
              gcc -O6可以干什么?
              
              目前,它和 -O2 (GCC 2.5) 或 -O3 (GCC 2.6, 2.7)功能一樣,所有版本大于它的功能也一樣。新版內(nèi)核的Makefiles使用-O2,所以你也應該用-O2。
              
              
              linux/*.h 和asm/*.h在什么地方?
              
              目錄 /usr/include/linux/ 和 /usr/include/asm/低下的文件是內(nèi)核頭文件的軟鏈接,內(nèi)核頭文件其實在目錄/usr/src/kernel*/低下。
              
              
              怎樣作一個共享函數(shù)庫?
              
              對ELF, 命令如下:
              
              gcc -fPIC -c *.c
              
              gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o
              
              對a.out,從 http://tsx-11.mit.edu/pub/linux/packages/GCC/src/ 下載n.nn.tar.gz,其中包含詳細說明。建議你將共享庫由a.out升級為ELF。
              
              
              為什么我編譯的可執(zhí)行程序非常大?
              
              用ELF編譯器,生成可執(zhí)行程序太大最可能的原因是沒有合適的.so庫與你使用的庫函數(shù)鏈接。對每一個象libc.so.5.2.18的函數(shù)庫,應該有一個象libc.so的鏈接。
              
              用a.out編譯器,生成可執(zhí)行程序太大可能是使用了-g選項,這會生成靜態(tài)鏈接庫而不是動態(tài)鏈接庫。
              
              
              從哪可以得到對于Linux的‘lint’?
              
              大部分‘lint’的功能已經(jīng)內(nèi)置進了GCC,打開GCC的-Wall選項會打開許多有用的外部警告。
              
              還有一個叫`lclint'的軟件功能和傳統(tǒng)的lint差不多,原代碼可以在http://larch.lcs.mit.edu /pub/Larch/lclint/中找到。
                做人要厚道,請注明轉(zhuǎn)自酷網(wǎng)動力(www.ASPCOOL.COM)。
            posted on 2007-04-05 10:34 true 閱讀(353) 評論(0)  編輯 收藏 引用 所屬分類: linux
            香蕉99久久国产综合精品宅男自 | 色欲久久久天天天综合网精品| 午夜精品久久久久久| 四虎国产精品成人免费久久| 久久久久久国产精品无码下载 | 狠狠综合久久AV一区二区三区| 日韩精品无码久久一区二区三 | 中文字幕精品久久| 欧美激情精品久久久久久| 久久久久久亚洲精品不卡| 合区精品久久久中文字幕一区| 无码任你躁久久久久久| 亚洲欧洲久久久精品| 久久精品亚洲AV久久久无码| 少妇人妻综合久久中文字幕| 亚洲欧美日韩中文久久| 久久久无码精品亚洲日韩蜜臀浪潮 | 国产一区二区久久久| 色狠狠久久AV五月综合| 狠狠色丁香婷婷久久综合不卡| 久久久久综合网久久| 亚洲精品无码久久久久AV麻豆| 久久99热这里只频精品6| 久久婷婷五月综合色奶水99啪| 九九久久99综合一区二区| 久久久久久A亚洲欧洲AV冫| 日韩欧美亚洲综合久久| 国产精品久久成人影院| 亚洲精品高清一二区久久| 久久精品国产亚洲av麻豆色欲| 国产精品成人99久久久久91gav | 国产精品99久久久久久董美香| 久久99国产精品成人欧美| 思思久久精品在热线热| 久久精品这里热有精品| 亚洲精品美女久久久久99小说| 国产精品久久久久AV福利动漫| 亚洲AⅤ优女AV综合久久久| 精品久久久久久国产| 亚洲精品无码久久千人斩| 国产精品99久久久久久猫咪|