一、編譯過(guò)程
?在使用gcc編譯程序時(shí),編譯過(guò)程可以簡(jiǎn)要?jiǎng)澐譃?個(gè)階段:
? ? ? ? 預(yù)處理、編譯、匯編、鏈接
1.1 預(yù)處理(preprocessing)
這個(gè)階段主要處理源文件中的#indef、#include和#define預(yù)處理命令;
這里主要是把一些include的頭文件和一些宏定義,放到源文件中。
編譯命令:gcc? -E? -o? hello.i? hello.c
?1.2 編譯(compilation)
將經(jīng)過(guò)預(yù)處理文件(test.i)之后的程序轉(zhuǎn)換成特定匯編(test.s)代碼
?編譯命令:gcc? -S? -o? hello.s? hello.i
1.3 匯編(assembly)
匯編過(guò)程將上一步的匯編代碼轉(zhuǎn)換成機(jī)器碼,這一步產(chǎn)生的文件叫做目標(biāo)文件,是二進(jìn)制格式
編譯命令:?gcc? -c? -o? hello.o? hello.s
1.4 鏈接(linking)?
鏈接過(guò)程使用鏈接器將該目標(biāo)文件與其他目標(biāo)文件、庫(kù)文件、啟動(dòng)文件等鏈接起來(lái)生成可執(zhí)行文件。附加的目標(biāo)文件包括靜態(tài)連接庫(kù)和動(dòng)態(tài)連接庫(kù)。
編譯命令:gcc? -o? hello? hello.o?
?二、 常用編譯選項(xiàng)
2.1?-c
????????預(yù)處理、編譯和匯編源文件,但是不作鏈接,編譯器根據(jù)源文件生成 OBJ 文件。缺省情況下, GCC 通過(guò)用`.o'替換源文件名的后綴`.c', `.i', `.s'等,產(chǎn)生 OBJ 文件名??梢允褂?o 選項(xiàng)選擇其他名字。 GCC 忽略-c 選項(xiàng)后面任何無(wú)法識(shí)別的輸入文件
2.2 -S
?????????編譯后即停止,不進(jìn)行匯編。對(duì)于每個(gè)輸入的非匯編語(yǔ)言文件,輸出結(jié)果是匯編語(yǔ)言文件。缺省情況下, GCC 通過(guò)用`.s'替換源文件名后綴`.c', `.i'等等,產(chǎn)生匯編文件名??梢允褂?o 選項(xiàng)選擇其他名字。 GCC 忽略任何不需要匯編的輸入文件
2.3 -E
????????預(yù)處理后即停止,不進(jìn)行編譯。預(yù)處理后的代碼送往標(biāo)準(zhǔn)輸出?
2.4 -o file
????????指定輸出文件為 file。無(wú)論是預(yù)處理、編譯、匯編還是鏈接,這個(gè)選項(xiàng)都可以使用。如果沒(méi)有使用`-o'選項(xiàng),默認(rèn)的輸出結(jié)果是:可執(zhí)行文件為`a.out';修改輸入文件的名稱是`source.suffix',則它的 OBJ 文件是`source.o',匯編文件是 `source.s',而預(yù)處理后的 C 源代碼送往標(biāo)準(zhǔn)輸出。?
2.5 -v?
顯示制作 GCC 工具自身時(shí)的配置命令;同時(shí)顯示編譯器驅(qū)動(dòng)程序、預(yù)處理器、編譯器的版本號(hào)
2.6?-Wall
打開(kāi)了所有需要注意的警告信息,比如沒(méi)有指定類(lèi)型的聲明、在聲明之前就使用的函數(shù)、局部變量除了聲明就沒(méi)再使用等?
2.7?-g
以操作系統(tǒng)的本地格式(stabs, COFF, XCOFF,或 DWARF)產(chǎn)生調(diào)試信息, GDB 能夠使用這些調(diào)試信息?
2.8?-O、-O1、-O2、-O3
優(yōu)化:對(duì)于大函數(shù),優(yōu)化編譯的過(guò)程將占用稍微多的時(shí)間和相當(dāng)大的內(nèi)存?
-O:不優(yōu)化
-O1:優(yōu)化一些
-O2:多優(yōu)化一些
-O3:優(yōu)化的更多
2.9?-llibrary
鏈接名為 library 的庫(kù)文件。鏈接器在標(biāo)準(zhǔn)搜索目錄中尋找這個(gè)庫(kù)文件,庫(kù)文件的真正名字是`liblibrary.a'?
2.10?-nostartfiles?
不鏈接系統(tǒng)標(biāo)準(zhǔn)啟動(dòng)文件,而標(biāo)準(zhǔn)庫(kù)文件仍然正常使用?
2.11?-nostdlib
不鏈接系統(tǒng)標(biāo)準(zhǔn)啟動(dòng)文件和標(biāo)準(zhǔn)庫(kù)文件,只把指定的文件傳遞給鏈接器?
2.12?-static?
在支持動(dòng)態(tài)鏈接(dynamic linking)的系統(tǒng)上,阻止鏈接共享庫(kù)?
2.13?-shared?
生成一個(gè)共享 OBJ 文件,它可以和其他 OBJ 文件鏈接產(chǎn)生可執(zhí)行文件?
2.14?-Idir?
在頭文件的搜索路徑列表中添加 dir 目錄?
2.15?-I?(?i?的大寫(xiě))
指定頭文件路徑(相對(duì)路徑或絕對(duì)路徑,建議相對(duì)路徑)?
2.16 -L?
指定連接的動(dòng)態(tài)庫(kù)或者靜態(tài)庫(kù)路徑(相對(duì)路徑或絕對(duì)路徑,建議相對(duì)路徑)?
2.17 -fPIC
用于生成位置無(wú)關(guān)的代碼(Position-Independent-Code),可以使得動(dòng)態(tài)庫(kù)可以被多個(gè)程序共享?
三、庫(kù)的制作與使用
3.1 制作、使用動(dòng)態(tài)庫(kù)
1.將源文件進(jìn)行匯編操作,需要使用參數(shù) -c, 還需要添加額外參數(shù) -fpic /-fPIC
gcc 源文件(*.c) -c -fPIC
2.?將得到的.o 文件打包成動(dòng)態(tài)庫(kù),還是使用 gcc, 使用參數(shù) -shared 指定生成動(dòng)態(tài)庫(kù)??
gcc -shared 與位置無(wú)關(guān)的目標(biāo)文件(*.o) -o 動(dòng)態(tài)庫(kù)(libxxx.so)?
3.? 編譯APP
gcc -o test main.o?-lsub?-L /libsub.so/所在目錄/
?4. 使用APP文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-809723.html
- 先把 libsub.so 放到 Ubuntu 的/lib 目錄,然后就可以運(yùn)行 test 程序
- 如果不想把 libsub.so 放到/lib,也可以放在某個(gè)目錄比如/a,然后執(zhí)行 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/a
?export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
./test文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-809723.html
3.2?制作、使用靜態(tài)庫(kù)
1.將源文件進(jìn)行匯編操作,需要使用參數(shù) -c, 還需要添加額外參數(shù) -fpic /-fPIC
gcc 源文件(*.c) -c -fPIC
2.??將得到的.o 文件打包成動(dòng)態(tài)庫(kù),使用 ar指令生成靜態(tài)庫(kù)
ar? crs? 靜態(tài)庫(kù)(libxxx.so)?? 與位置無(wú)關(guān)的目標(biāo)文件(*.o)
3.??編譯APP
gcc -o test main.o?-lsub?-L /libsub.a/所在目錄/
?4. 使用APP
./test
到了這里,關(guān)于【Linux】03 GCC編譯器的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!