介紹
如果您是c語言程序員避免不了要使用gcc編譯您的源程序跪削,下面就介紹一下一個(gè)c語言源文件怎么使用gcc加工成可執(zhí)行程序
c語言編譯過程
預(yù)處理 ---> 編譯 ---> 匯編 ---> 連接
如果您寫好了一個(gè)c語言源文件谋国,那么此時(shí)需要用編譯程序?qū)⑺幚沓煽蓤?zhí)行文件前痘。處理的過程分別是:
- 預(yù)處理:將源程序進(jìn)行預(yù)處理替換苛萎,比如 #include xxx 會用xxx文件的內(nèi)容替換到源程序中
- 編譯:將預(yù)處理好的源文件編譯成目標(biāo)文件洞翩,此時(shí)不是二進(jìn)制文件(中間產(chǎn)物)
- 匯編:將源程序翻譯成匯編語言(中間產(chǎn)物)
- 連接:將庫焊虏、目標(biāo)文件等中間產(chǎn)物連接到一起港令,生成最終的二進(jìn)制可執(zhí)行文件
中間的過程稍有些復(fù)雜啥容,這里簡單的介紹一下:
- 根據(jù)不同系統(tǒng)不同編譯器,處理的過程是不同的
- 有些系統(tǒng)編譯和連接是分開的顷霹,需要分兩步進(jìn)行
- 像預(yù)處理和匯編等都是中間處理過程的產(chǎn)物咪惠,程序員只需要在用到時(shí)將它們輸出即可
- gcc編譯器可以用不同參數(shù)分別給出您想要的結(jié)果
gcc 常用參數(shù)的簡要說明
源文件或生成文件后綴名 | 使用參數(shù)生產(chǎn)前面的文件 | 說明 | 備注 |
---|---|---|---|
.c (小寫) | 用編輯器敲出來的文本文件,C語言的源文件 | ||
.o (小寫) | -c (小寫) | 只編譯源文件淋淀,生成的目標(biāo)文件(自動生成) | 加 -o (小寫) xxx.o 可以生成相應(yīng)名字的文件 |
.i | -E | 只進(jìn)行預(yù)處理遥昧,默認(rèn)打印到屏幕上 | 加 -o (小寫) xxx.i 可以生成相應(yīng)名字的文件 |
.s (小寫) | -S (大寫) | 生成匯編文件,默認(rèn)自動生成 | 加 -o (小寫) xxx.s 可以生成相應(yīng)名字的文件 |
-g | 生成用于 dbg 可調(diào)試的文件 | ||
-O -O2 (大寫) | 不同等級的優(yōu)化程序 | ||
-std=c99 | 某些編譯器激活c99特性 | ||
-static | 禁止使用共享連接 | ||
-shared | 生成共享目標(biāo)文件。通常用在建立共享庫時(shí) | ||
-ansi | 只支持 ANSI 標(biāo)準(zhǔn)的 C 語法炭臭。這一選項(xiàng)將禁止 GNU C 的某些特色永脓, 例如 asm 或 typeof 關(guān)鍵詞 | ||
-w | 不生成任何警告信息 | ||
-Wall | 生成所有警告信息 |
# 范例:
gcc xxx.c # 會直接生產(chǎn)一個(gè) a.out 的可執(zhí)行程序,-o 參數(shù)可以改名
gcc -c xxx.c # 生成一個(gè) xxx.o 的目標(biāo)文件
gcc -E xxx.c # 在屏幕上打印預(yù)處理后的文件
gcc -E xxx.c -o xxx.i # 將生成 xxx.i 的文件鞋仍,-o 參數(shù)可以生成不同名字 如:-o zzz.i
gcc -S xxx.c # 自動生成 xxx.s 的匯編文件常摧,-o 參數(shù)可以改名
# 一般來說 -o 參數(shù)就是將生成的內(nèi)容以不同名字保存成文件
# 如果需要用 gdb 進(jìn)行調(diào)試需要添加 -g 參數(shù)
gcc 如何查找文件路徑
gcc在編譯連接時(shí)需要找到頭文件或庫文件,那么是如何找到的呢
- 首先要從 -I 參數(shù)開始找凿试,自己給定的
- 然后尋找gcc的環(huán)境變量 C_INCLUDE_PATH排宰,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
- 接下來從默認(rèn)的路徑中尋找
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/……/……/……/……/include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/……/……/……/……/i386-linux/include
# 如果裝gcc的時(shí)候那婉,是有給定的prefix的話板甘,那么就是
/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include
- 那么如何手動指定路徑呢
# 例:
gcc -o hello hello.c -l /home/hello/include -L /home/hello/lib -lworld
# 上面的這句話是在編譯hello時(shí)
# -l /home/hello/include 表示:
# /home/hello/include 目錄作為第一個(gè)尋找頭文件的目錄。
# 尋找的順序是 /home/hello/include --> /usr/include --> /usr/local/include
# -L /home/hello/lib 表示:
# /home/hello/lib 目錄作為第一個(gè)尋找?guī)煳募哪夸洝?# 尋找的順序是 /home/hello/include --> /lib --> /usr/lib --> /usr/local/lib
# -lworld 表示:
# 在上面的路徑中尋找 libworld.so 動態(tài)庫文件详炬。
# 如果 gcc 編譯選項(xiàng)中加入了 -static 則表示尋找 libworld.a 靜態(tài)文件庫盐类。
結(jié)束