版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、一、編譯過程概覽gcc編譯器對程序的編譯過程有四個階段:預(yù)處理(preprocessing)編譯(com-pilation proper)> 匯編(assembly和鏈接(linking)。預(yù)處理:對源文件(source file)進(jìn)行預(yù)處理,進(jìn)行宏定義的替換等。編譯:將進(jìn)行完預(yù)處理的源文件編譯成匯編文件(assembly file)。將C源代碼編譯成匯編語言。匯編:將匯編文件匯編成目標(biāo)文件(object file)。鏈接:將一個或多個目標(biāo)文件鏈接成一個可執(zhí)行的二進(jìn)制文件(execute file)。鏈接的目標(biāo)文件中有且只有一個 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)行匯編。輸出為每一個指定的未編譯的輸入文件 的匯編代碼文件。輸入文件格式為.c、.i等,輸出文件格式為.s。-c編譯或者匯編源文件,不進(jìn)行鏈接。輸出為每一個源文件的目標(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ù)處理階段可以用到的一些選項。-C 保留文件頭注釋。-D n ame-D n ame=defi niti on預(yù)定義宏(源文件中不能定義該宏),-D name宏定義的值為1-U
7、 n ame取消宏定義nameo按照他們在命令行自左至右的順序執(zhí)行-U和-D。-un def不預(yù)定義任何系統(tǒng)指定和GCC指定的宏,標(biāo)準(zhǔn)的宏仍然預(yù)定義。-I directory設(shè)置頭文件(.h)的搜索路徑。可以多次使用-I包含多個搜索路徑。在搜索 頭文件的時候,先搜索-I指定的路徑,再搜索系統(tǒng)頭文件路徑。-M-MM查看依賴文件。按照make的描述規(guī)則輸出源文件的依賴,目標(biāo)文件:所有 被包含的文件名。如果在編譯時使用到了 -I dir,這里也需要指定對應(yīng)的dir。-MM 忽略標(biāo)準(zhǔn)庫的依賴。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)庫和動態(tài)庫庫只不過是目標(biāo)文件的一個集合(一個容器)。如果一些目標(biāo)文件針對某個 給定的問題有相
9、互關(guān)聯(lián)的行為,那么久可以把這些目標(biāo)文件整合到一個庫當(dāng)中, 從而簡化應(yīng)用程序開發(fā)人員對這些目標(biāo)文件的存取和分發(fā)。靜態(tài)庫(archive file,歸檔文件)由ar或者archive工具創(chuàng)建。在開發(fā)人員 編譯并與庫鏈接后,庫中被需要的部分就會被整合到可執(zhí)行映像中。 從應(yīng)用程序 的角度看,應(yīng)用程序映像已經(jīng)包含了庫中自己所需要的部分, 因此它與外部的庫 不再有關(guān)聯(lián)。共享庫(share file)或動態(tài)庫也是與應(yīng)用程序映像鏈接在一起,但是這種鏈 接分兩個階段完成。第一階段(應(yīng)用程序生成階段),鏈接器會檢查確認(rèn)應(yīng)用程 序生成所需要的全部符號(函數(shù)或變量)在應(yīng)用程序或庫中可用。但是庫中相應(yīng) 的部分并不被整合
10、到應(yīng)用程序的映像中(靜態(tài)庫就是這樣直接整合的),而是在第二階段(運行階段)由動態(tài)加載器將所有需要的共享庫中的那部分加載入內(nèi)存, 與應(yīng)用程序映像動態(tài)地鏈接在一起。 這樣可以形成更小的映像文件,因為共享庫與應(yīng)用程序映像是獨立的。使用共享庫節(jié)省內(nèi)存的代價是庫必須在運行時解析。 明確庫中那些部分是需要的,找到這些部分,然后將它載入內(nèi)存這個過程需要點時間。應(yīng)用程 序A應(yīng)用程 序B靜態(tài)庫靜態(tài)庫I應(yīng)用程I I應(yīng)目程II 序A| 序B |p/2. 鏈接階段可以用到的一些選項-l library在鏈接的時候搜索名字為library的庫。搜索的目錄是標(biāo)準(zhǔn)系統(tǒng)目錄加上-L 指定的目錄。真正搜索的庫的文件名為libl
11、ibrary.a或者liblibrary.so (即在庫名前 加lib,后面添加后綴.a或者.so)。.a為靜態(tài)庫,.so為動態(tài)庫。若兩個庫同時存 在,默認(rèn)鏈接動態(tài)鏈接庫。-L directory為-l添加搜索的目錄。-static在支持動態(tài)鏈接的系統(tǒng)上,阻止一切動態(tài)鏈接。3. 靜態(tài)庫和動態(tài)庫的創(chuàng)建(1)動態(tài)庫的創(chuàng)建-fPIC為了創(chuàng)建動態(tài)鏈接庫,源文件的編譯要有些不同,在編譯的時候添加-fPIC參數(shù)。-shared用添加了 -fPIC參數(shù)編譯后的目標(biāo)文件(一個或者幾個)創(chuàng)建一個動態(tài)庫。靜態(tài)庫的創(chuàng)建靜態(tài)庫就是多個目標(biāo)文件的打包。創(chuàng)建靜態(tài)庫需要借助ar工具包將多個目標(biāo)文件打包。ar -cru &l
12、t;archive> <object1> <object2>ar工具的重要選項選項名稱示例-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)庫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)鏈接庫,對于靜態(tài)鏈接庫來說,只要在鏈接的時候找到靜態(tài)鏈接庫 即可。因為在鏈接時已經(jīng)將映像包含在可執(zhí)行程序之中。 程序在運行的時候與靜 態(tài)鏈接庫沒有任何關(guān)系。鏈接時用-I指明要搜索的靜態(tài)鏈接庫。丄添加搜索路徑,若不添加僅搜索系 統(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)鏈接庫的絕對路徑進(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生成動態(tài)庫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鏈接動態(tài)鏈接庫,對于動態(tài)鏈接庫來說,不僅在鏈接的時候能夠找到動態(tài)鏈 接庫,在運行的時候也要找到靜態(tài)鏈接庫。動態(tài)鏈接庫在鏈接時的操作與靜態(tài)鏈接庫相同。這里注意一點,若對于mylib庫同時存在動態(tài)庫libmylib.so和靜態(tài)庫 libmylib.a,用-l搜索時會優(yōu)先鏈接動態(tài)庫。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使用的動態(tài)鏈接庫。libmylib.so=>not found,意思是shtest使用了 動態(tài)鏈接庫libmylib.so,但是沒找到。因為對于動態(tài)鏈接庫,不僅要在編譯的時 候找到,在運行的時候也需要找到。這個與路徑有關(guān),下面我們會提到。應(yīng)用程序獨享的動態(tài)鏈接庫。有很多共享庫只被特定的應(yīng)用程序使用,那么就沒有必
22、要加入系統(tǒng)庫路徑,以免應(yīng)用程序的共享庫之間發(fā)生版本沖突。因此Linux還可以通過設(shè)置環(huán)境變量LD_LIBRARY_PATH 來臨時指定應(yīng)用程序的共享庫搜索路徑。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也可以將動態(tài)鏈接庫最為系統(tǒng)共享的動態(tài)鏈接庫。 方法一,可以將動態(tài)鏈接 庫放入系統(tǒng)庫的目錄下;方法二,將動態(tài)鏈接庫放入一個自定義的目錄下, 然后 通過修改配置文件/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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度醫(yī)療器械注冊代理與產(chǎn)品上市許可合同4篇
- 二零二五年度智能樓宇水電系統(tǒng)優(yōu)化與維修合同范本4篇
- 二零二四圖書采購合同:圖書館數(shù)字資源采購與維護(hù)協(xié)議3篇
- 2024洗車行業(yè)場地租賃專項合同版B版
- 二零二五餐飲業(yè)員工勞動合同簽訂與試用期規(guī)定合同范本3篇
- 個性化外遇離婚合同范本(2024年度)一
- 二零二四年度醫(yī)療機(jī)構(gòu)醫(yī)療期醫(yī)護(hù)人員培訓(xùn)與職業(yè)發(fā)展合同3篇
- 2025年度網(wǎng)約車平臺駕駛員職業(yè)發(fā)展及培訓(xùn)服務(wù)合同4篇
- 二零二五年度拆遷補償與歷史文化名城保護(hù)合同3篇
- 2025年度美縫施工行業(yè)規(guī)范與認(rèn)證服務(wù)合同4篇
- 2025年度杭州市固廢處理與資源化利用合同3篇
- 2024年安徽省公務(wù)員錄用考試《行測》真題及答案解析
- 部編版二年級下冊《道德與法治》教案及反思(更新)
- 充電樁項目運營方案
- 退休人員出國探親申請書
- 高中物理競賽真題分類匯編 4 光學(xué) (學(xué)生版+解析版50題)
- 西方經(jīng)濟(jì)學(xué)-高鴻業(yè)-筆記
- 幼兒園美術(shù)教育研究策略國內(nèi)外
- 2024屆河南省五市高三第一次聯(lián)考英語試題及答案
- 孕婦學(xué)校品管圈課件
- 《愿望的實現(xiàn)》交流ppt課件2
評論
0/150
提交評論