![gcc常用參數(shù)(靜動(dòng)態(tài)鏈接優(yōu)化調(diào)試)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/27/67addcc8-f7db-4527-9b6f-c3a404d847c3/67addcc8-f7db-4527-9b6f-c3a404d847c31.gif)
![gcc常用參數(shù)(靜動(dòng)態(tài)鏈接優(yōu)化調(diào)試)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/27/67addcc8-f7db-4527-9b6f-c3a404d847c3/67addcc8-f7db-4527-9b6f-c3a404d847c32.gif)
![gcc常用參數(shù)(靜動(dòng)態(tài)鏈接優(yōu)化調(diào)試)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/27/67addcc8-f7db-4527-9b6f-c3a404d847c3/67addcc8-f7db-4527-9b6f-c3a404d847c33.gif)
![gcc常用參數(shù)(靜動(dòng)態(tài)鏈接優(yōu)化調(diào)試)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/27/67addcc8-f7db-4527-9b6f-c3a404d847c3/67addcc8-f7db-4527-9b6f-c3a404d847c34.gif)
![gcc常用參數(shù)(靜動(dòng)態(tài)鏈接優(yōu)化調(diào)試)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/27/67addcc8-f7db-4527-9b6f-c3a404d847c3/67addcc8-f7db-4527-9b6f-c3a404d847c35.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、編譯過程概覽gcc編譯器對(duì)程序的編譯過程有四個(gè)階段:預(yù)處理(preprocessing)編譯(com-pilation proper)> 匯編(assembly和鏈接(linking)。預(yù)處理:對(duì)源文件(source file)進(jìn)行預(yù)處理,進(jìn)行宏定義的替換等。編譯:將進(jìn)行完預(yù)處理的源文件編譯成匯編文件(assembly file)。將C源代碼編譯成匯編語言。匯編:將匯編文件匯編成目標(biāo)文件(object file)。鏈接:將一個(gè)或多個(gè)目標(biāo)文件鏈接成一個(gè)可執(zhí)行的二進(jìn)制文件(execute file)。鏈接的目標(biāo)文件中有且只有一個(gè) main函數(shù),作為可執(zhí)行文件的開始。-E在預(yù)處理階段之后停
2、止,不進(jìn)行編譯。輸出是預(yù)處理之后的源碼,默認(rèn)發(fā)送 到標(biāo)準(zhǔn)輸出(standard output。輸入文件格式為.c等,默認(rèn)輸出為標(biāo)準(zhǔn)輸出。-S在編譯階段之后停止,不進(jìn)行匯編。輸出為每一個(gè)指定的未編譯的輸入文件 的匯編代碼文件。輸入文件格式為.c、.i等,輸出文件格式為.s。-c編譯或者匯編源文件,不進(jìn)行鏈接。輸出為每一個(gè)源文件的目標(biāo)文件。輸入文件格式為.c、.i、.s,輸出文件格式為.0。-o file name-o指定輸出文件的文件名,如果沒有指定-o,則默認(rèn)輸出的可執(zhí)行文件名是a.out,默認(rèn)輸出的source.suffix的匯編文件名為source.s目標(biāo)文件名位 source. 默認(rèn)的預(yù)
3、處理后的源文件輸出到標(biāo)準(zhǔn)輸出。main .c/*Study for using gcc*/Iinclude <stdia hA#include <stdlib.h>#define TESTD 2int main(int argcr char *argv)#lfdef _MYDEBUG_ prlntf fan*);#elseprintf("bn"); #endifreturn EXITSUCCESS;gcc -E main.c -o main.itali main.iwy白wyaibyn-desktop:'/learnning$ gee -E mai
4、n.c -o main.i wyaibynwyaibyn-desktop/learnning$ tail main i# 3 llmainTCM 2int main(int argc, char *airgv)printf(hbnH);return 0;wyaibynwyaibyn-desktop:*/learnning$ |gcc-S main.i -o main.s tail main.swyaibyn(9wyaibyn-desktop:'/learnnings gcc *S main,c -0 main,s wyaibyntyaibyn-desktop:-/learnnings
5、tail mainandl$-16r %e$psubl$16, %espmovl$4LC9r (esp)callputsmo譏$0, %eaxleaveret.size main, .-main,ident "GCC: (Ubuntu 4.4.3*4ubuntu5) 4,4.3" section.note.GNU-stack,"Mfprogbitsps: gcc -S main.c main.s也是可以的。gcc -c main.s -o main.o gcc main.o-o test ./testwyaibynyaibyn-desktop:-/learnnin
6、gs gcc -c main£ -0 main.o wyaibynwyaibyn-desktop:-/learnning$ gcc main.o -o test wyaibynwyaibyn-desktop:-/learnningS ./testbps: gcc -c main.i(main.c) main.ogcc ma in .c(ma in.i mai n.s) -o test 者 E是可以的二、預(yù)處理 預(yù)處理階段可以用到的一些選項(xiàng)。-C 保留文件頭注釋。-D n ame-D n ame=defi niti on預(yù)定義宏(源文件中不能定義該宏),-D name宏定義的值為1-U
7、 n ame取消宏定義nameo按照他們?cè)诿钚凶宰笾劣业捻樞驁?zhí)行-U和-D。-un def不預(yù)定義任何系統(tǒng)指定和GCC指定的宏,標(biāo)準(zhǔn)的宏仍然預(yù)定義。-I directory設(shè)置頭文件(.h)的搜索路徑??梢远啻问褂?I包含多個(gè)搜索路徑。在搜索 頭文件的時(shí)候,先搜索-I指定的路徑,再搜索系統(tǒng)頭文件路徑。-M-MM查看依賴文件。按照make的描述規(guī)則輸出源文件的依賴,目標(biāo)文件:所有 被包含的文件名。如果在編譯時(shí)使用到了 -I dir,這里也需要指定對(duì)應(yīng)的dir。-MM 忽略標(biāo)準(zhǔn)庫(kù)的依賴。gcc -D _MYDEBUG_ -E main.c -o main.i tali main.iwyaibyn
8、(awyaibyn-desktop:/learnning$ gcc -D MYDEBUG -E main.c -o main.i wyaibynwyaibyn-desktop/learnning$ tail mainiint mainfint ags char *argv)printf("an");retun S;gcc -MM main.cwyaibynwyajbyn-desktop:*/learnning$ gcc -MM main matrro: main-c三、鏈接1. 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)庫(kù)只不過是目標(biāo)文件的一個(gè)集合(一個(gè)容器)。如果一些目標(biāo)文件針對(duì)某個(gè) 給定的問題有相
9、互關(guān)聯(lián)的行為,那么久可以把這些目標(biāo)文件整合到一個(gè)庫(kù)當(dāng)中, 從而簡(jiǎn)化應(yīng)用程序開發(fā)人員對(duì)這些目標(biāo)文件的存取和分發(fā)。靜態(tài)庫(kù)(archive file,歸檔文件)由ar或者archive工具創(chuàng)建。在開發(fā)人員 編譯并與庫(kù)鏈接后,庫(kù)中被需要的部分就會(huì)被整合到可執(zhí)行映像中。 從應(yīng)用程序 的角度看,應(yīng)用程序映像已經(jīng)包含了庫(kù)中自己所需要的部分, 因此它與外部的庫(kù) 不再有關(guān)聯(lián)。共享庫(kù)(share file)或動(dòng)態(tài)庫(kù)也是與應(yīng)用程序映像鏈接在一起,但是這種鏈 接分兩個(gè)階段完成。第一階段(應(yīng)用程序生成階段),鏈接器會(huì)檢查確認(rèn)應(yīng)用程 序生成所需要的全部符號(hào)(函數(shù)或變量)在應(yīng)用程序或庫(kù)中可用。但是庫(kù)中相應(yīng) 的部分并不被整合
10、到應(yīng)用程序的映像中(靜態(tài)庫(kù)就是這樣直接整合的),而是在第二階段(運(yùn)行階段)由動(dòng)態(tài)加載器將所有需要的共享庫(kù)中的那部分加載入內(nèi)存, 與應(yīng)用程序映像動(dòng)態(tài)地鏈接在一起。 這樣可以形成更小的映像文件,因?yàn)楣蚕韼?kù)與應(yīng)用程序映像是獨(dú)立的。使用共享庫(kù)節(jié)省內(nèi)存的代價(jià)是庫(kù)必須在運(yùn)行時(shí)解析。 明確庫(kù)中那些部分是需要的,找到這些部分,然后將它載入內(nèi)存這個(gè)過程需要點(diǎn)時(shí)間。應(yīng)用程 序A應(yīng)用程 序B靜態(tài)庫(kù)靜態(tài)庫(kù)I應(yīng)用程I I應(yīng)目程II 序A| 序B |p/2. 鏈接階段可以用到的一些選項(xiàng)-l library在鏈接的時(shí)候搜索名字為library的庫(kù)。搜索的目錄是標(biāo)準(zhǔn)系統(tǒng)目錄加上-L 指定的目錄。真正搜索的庫(kù)的文件名為libl
11、ibrary.a或者liblibrary.so (即在庫(kù)名前 加lib,后面添加后綴.a或者.so)。.a為靜態(tài)庫(kù),.so為動(dòng)態(tài)庫(kù)。若兩個(gè)庫(kù)同時(shí)存 在,默認(rèn)鏈接動(dòng)態(tài)鏈接庫(kù)。-L directory為-l添加搜索的目錄。-static在支持動(dòng)態(tài)鏈接的系統(tǒng)上,阻止一切動(dòng)態(tài)鏈接。3. 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的創(chuàng)建(1)動(dòng)態(tài)庫(kù)的創(chuàng)建-fPIC為了創(chuàng)建動(dòng)態(tài)鏈接庫(kù),源文件的編譯要有些不同,在編譯的時(shí)候添加-fPIC參數(shù)。-shared用添加了 -fPIC參數(shù)編譯后的目標(biāo)文件(一個(gè)或者幾個(gè))創(chuàng)建一個(gè)動(dòng)態(tài)庫(kù)。靜態(tài)庫(kù)的創(chuàng)建靜態(tài)庫(kù)就是多個(gè)目標(biāo)文件的打包。創(chuàng)建靜態(tài)庫(kù)需要借助ar工具包將多個(gè)目標(biāo)文件打包。ar -cru &l
12、t;archive> <object1> <object2>ar工具的重要選項(xiàng)選項(xiàng)名稱示例-d刪除ar <archive> <object>-r插入(替換)ar - <archive> <object>-t列表ar -<archive>-x提取ar <archive> <object>-c創(chuàng)建ar <archive>-ru更新目標(biāo)ar -u <archive> <object>main.c嚴(yán)study for using gcc*/#includ
13、e <stdio4h> include <stdlib.h> include "libah" #include "libb.h"int main(int argc, char *argv) #ifdef _MYDEBUG_printf("ayn");#elseprintf(flbnu);#endiflibafuncf);libbfuncO;return EXIT SUCCESS; liba.h#ifndef MYLIBA H#define MYLIBA_H_| #elseint libafunc(); #end
14、ifliba.c妙include *liba.h"include <stdio.h>int libafuncf)( printf("I am a liba functionYn");return 0;|libb.h#ifndefMYILIBB H#definemylibbI h#else int libbfuncf);#endiflibb.c#include "libb.h*include <stdio h>int libbfuncf)(printf ("I am a libb functionn1F);return 0
15、;4舉例生成靜態(tài)庫(kù)libmylib.a。gcc -c liba.cgcc -c libb.car -cru -o libmylib.a liba.o libb.owyaibyn(awyaibyn-desktop: /lea rnnings rm libmylib. so wyaibyrKawyaibyn-desktop:-/learnnings gcc -c liba wyaibyrxawyaibyn-desktop:'/learnnings gcc -c libb.c wyaibynwyaibyn-desktop:-/learnning$ ar *cru *o libmylib.a
16、liba.o libb.o wyaibyrn?wyaibyn-desktop:/learnningS Islibm.c liba.h libo.o libblibb*h libb”o libmylib.a main鏈接靜態(tài)鏈接庫(kù),對(duì)于靜態(tài)鏈接庫(kù)來說,只要在鏈接的時(shí)候找到靜態(tài)鏈接庫(kù) 即可。因?yàn)樵阪溄訒r(shí)已經(jīng)將映像包含在可執(zhí)行程序之中。 程序在運(yùn)行的時(shí)候與靜 態(tài)鏈接庫(kù)沒有任何關(guān)系。鏈接時(shí)用-I指明要搜索的靜態(tài)鏈接庫(kù)。丄添加搜索路徑,若不添加僅搜索系 統(tǒng)路徑,/lib /usr/lib 等gcc -o artest main.c -mylib -L. ./artestwyaibyn(?wyaibyn-
17、desktop: -/learnnings ./artest bI am a liba functionI am a libb function使用靜態(tài)鏈接庫(kù)的絕對(duì)路徑進(jìn)行鏈接。gcc -o artest main.c ./libmylib.a./artestwyaibyn(3wyaibyn-desktop:-/learnningS gcc -o artest m白irrc ./libmylib.a wyaibynwyaibyn-desktop:/learnnings ,/artest bI am a liba furctionI am a libb function生成動(dòng)態(tài)庫(kù)libmylib
18、.sogcc liba.c -PICgcc libb.c -PICgcc -shared -o libmylib.so liba.o libb.owyaibynwyaibyn-desktop:'/learnnirigs gcc -c liba.c -fPIC wyalbynwyai byn-des ktop:-/lea rnningl gcc libb.c -fPIC wyaibynwyaibyn-desktop:-/learnningS gcc -shared -o libmylib.so liba.o libb.o wyaibynwyaibyn-desktop:-/learnnin
19、gs Is artest liba-h kibb.c libb.o libmylib £<> lib占lib占.d libb.h libmylib.尋 皿占in.t鏈接動(dòng)態(tài)鏈接庫(kù),對(duì)于動(dòng)態(tài)鏈接庫(kù)來說,不僅在鏈接的時(shí)候能夠找到動(dòng)態(tài)鏈 接庫(kù),在運(yùn)行的時(shí)候也要找到靜態(tài)鏈接庫(kù)。動(dòng)態(tài)鏈接庫(kù)在鏈接時(shí)的操作與靜態(tài)鏈接庫(kù)相同。這里注意一點(diǎn),若對(duì)于mylib庫(kù)同時(shí)存在動(dòng)態(tài)庫(kù)libmylib.so和靜態(tài)庫(kù) libmylib.a,用-l搜索時(shí)會(huì)優(yōu)先鏈接動(dòng)態(tài)庫(kù)。gcc -o shtest main.c-mylib wyaibynwyaibyn-desktop:'/learnningj g
20、cc -o shtest mainx -1 mylib -L wyaibynwyaibyn-desktop:/learnningi Idd ./shtestlinux-gate.so.1 => (BxOBcf librnylibn so => not found libc.so.6 => /lib/tls/1686/CHOV/libc.so.6 (SxGSllQOSO /Ub/ld-Unux.so.2wyaibynfyaibyn-desktop:'/learnningt /slitest./shtest: error while loading shared libr
21、aries: libmylib.so: cannot open shared object file: no such file or directory./路徑下存在libmylib.a和libmylib.so,但是優(yōu)先鏈接libmylib.so。通過ldd 可以查看shtest使用的動(dòng)態(tài)鏈接庫(kù)。libmylib.so=>not found,意思是shtest使用了 動(dòng)態(tài)鏈接庫(kù)libmylib.so,但是沒找到。因?yàn)閷?duì)于動(dòng)態(tài)鏈接庫(kù),不僅要在編譯的時(shí) 候找到,在運(yùn)行的時(shí)候也需要找到。這個(gè)與路徑有關(guān),下面我們會(huì)提到。應(yīng)用程序獨(dú)享的動(dòng)態(tài)鏈接庫(kù)。有很多共享庫(kù)只被特定的應(yīng)用程序使用,那么就沒有必
22、要加入系統(tǒng)庫(kù)路徑,以免應(yīng)用程序的共享庫(kù)之間發(fā)生版本沖突。因此Linux還可以通過設(shè)置環(huán)境變量LD_LIBRARY_PATH 來臨時(shí)指定應(yīng)用程序的共享庫(kù)搜索路徑。export LD_LIBRARY_PATH=./ldd shtest./shtestwyaibynwyaibyn-desktop:*/learnningiS export LD LIBRARY PATH=./ wyaibyngwyaibyn-desktop:-/learnning$ ldd shtest linux-gate,so.1 =>(9xO9c28060libmylib.so => ./libmylib.so (0
23、x00b380Q0)libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xQ0ce9069) /lib/ld-limix.so.2 6x00751000)wyaibynwyaibyn-desktopr'/learnningS /shtest bI am a liba functionI am a libb function也可以將動(dòng)態(tài)鏈接庫(kù)最為系統(tǒng)共享的動(dòng)態(tài)鏈接庫(kù)。 方法一,可以將動(dòng)態(tài)鏈接 庫(kù)放入系統(tǒng)庫(kù)的目錄下;方法二,將動(dòng)態(tài)鏈接庫(kù)放入一個(gè)自定義的目錄下, 然后 通過修改配置文件/etc/ld.so.conf,將該目錄添加到Linux系統(tǒng)指定搜索路徑中。sudo cp libmylib.so /usr/lib Idd shtest./shtestwyaibynOwyaibyn-desktop:*/learnning$ sudo cp libmylib.so /usr/lib wyaibynwyaibyn- desktop:'/learnningS Idd shtestlinux-gate.so.l =>(ex091f5000)libmylib.so => /usr/lib/libmylib.so (0x00fb4006) libc.so.6 =&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級(jí)數(shù)學(xué)上冊(cè)蘇教版《釘子板上的多邊形》聽評(píng)課記錄
- 八年級(jí)數(shù)學(xué)上冊(cè) 14.3 因式分解 14.3.1 提公因式法聽評(píng)課記錄 新人教版
- 湘教版數(shù)學(xué)七年級(jí)上冊(cè)2.4《整式》聽評(píng)課記錄
- 青島版數(shù)學(xué)七年級(jí)下冊(cè)12.1《平方差公式》聽評(píng)課記錄
- 魯教版地理六年級(jí)下冊(cè)7.4《俄羅斯》聽課評(píng)課記錄1
- 人民版九年級(jí)政治全冊(cè)第三單元第八課依法治國(guó)第3-4喜中有憂我們共同的責(zé)任聽課評(píng)課記錄
- 中圖版地理八年級(jí)下冊(cè)7.4《巴西》聽課評(píng)課記錄
- 鋁合金窗產(chǎn)品質(zhì)量監(jiān)督抽查實(shí)施細(xì)則
- 小學(xué)二年級(jí)數(shù)學(xué)口算練習(xí)題
- 一年級(jí)英語聽評(píng)課記錄
- 一年級(jí)下冊(cè)勞動(dòng)《變色魚》課件
- 商務(wù)星球版地理八年級(jí)下冊(cè)全冊(cè)教案
- 天津市河西區(qū)2024-2025學(xué)年四年級(jí)(上)期末語文試卷(含答案)
- 2025年空白離婚協(xié)議書
- 校長(zhǎng)在行政會(huì)上總結(jié)講話結(jié)合新課標(biāo)精神給學(xué)校管理提出3點(diǎn)建議
- 北京市北京四中2025屆高三第四次模擬考試英語試卷含解析
- 2024年快遞行業(yè)無人機(jī)物流運(yùn)輸合同范本及法規(guī)遵循3篇
- T-CSUS 69-2024 智慧水務(wù)技術(shù)標(biāo)準(zhǔn)
- 2025年護(hù)理質(zhì)量與安全管理工作計(jì)劃
- 地下商業(yè)街的規(guī)劃設(shè)計(jì)
- 2024-2030年全球及中國(guó)低密度聚乙烯(LDPE)行業(yè)需求動(dòng)態(tài)及未來發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
評(píng)論
0/150
提交評(píng)論