c語言編譯全過程(GCC)

介紹

如果您是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é)束

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市呛谜,隨后出現(xiàn)的幾起案子在跳,更是在濱河造成了極大的恐慌,老刑警劉巖隐岛,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猫妙,死亡現(xiàn)場離奇詭異,居然都是意外死亡聚凹,警方通過查閱死者的電腦和手機(jī)割坠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妒牙,“玉大人彼哼,你說我怎么就攤上這事∠娼瘢” “怎么了敢朱?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摩瞎。 經(jīng)常有香客問我拴签,道長,這世上最難降的妖魔是什么旗们? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任篓吁,我火速辦了婚禮,結(jié)果婚禮上蚪拦,老公的妹妹穿的比我還像新娘杖剪。我一直安慰自己冻押,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布盛嘿。 她就那樣靜靜地躺著洛巢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪次兆。 梳的紋絲不亂的頭發(fā)上稿茉,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機(jī)與錄音芥炭,去河邊找鬼漓库。 笑死,一個(gè)胖子當(dāng)著我的面吹牛园蝠,可吹牛的內(nèi)容都是我干的渺蒿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼彪薛,長吁一口氣:“原來是場噩夢啊……” “哼茂装!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起善延,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤少态,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后易遣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彼妻,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年豆茫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侨歉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡澜薄,死狀恐怖为肮,靈堂內(nèi)的尸體忽然破棺而出摊册,到底是詐尸還是另有隱情肤京,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布茅特,位于F島的核電站忘分,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏白修。R本人自食惡果不足惜妒峦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兵睛。 院中可真熱鬧肯骇,春花似錦窥浪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胚鸯,卻和暖如春骨稿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姜钳。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工坦冠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哥桥。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓辙浑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泰讽。 傳聞我的和親對象是個(gè)殘疾皇子例衍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • GCC編譯器 GCC是一個(gè)交叉平臺的編譯器,我想大家并不會覺得陌生已卸。C/C++開發(fā)的時(shí)候很多時(shí)候都會用到GCC來進(jìn)...
    故事狗閱讀 9,148評論 0 25
  • 學(xué)過C語言的人都應(yīng)該知道佛玄,我們所編輯的C語言程序是不能直接放到機(jī)器上運(yùn)行的,它只不過是一個(gè)帶".c"后綴的文件(也...
    KBAC閱讀 4,854評論 0 1
  • 配圖是高考前一個(gè)月左右的時(shí)候的日記,那時(shí)候想留個(gè)東西愧哟,給高考后的自己奥吩,記錄那段睡不醒覺,做不完題蕊梧,卻又是總想再堅(jiān)持...
    知南讀書閱讀 627評論 8 13
  • 月亮里不可能噴涌出牛奶 我參加不了魔鬼的婚禮 也去不了精靈的舞會 兔子永遠(yuǎn)不可能跑到老虎的前面 大海的深處長不出仙...
    萊萊菌閱讀 243評論 0 1
  • 慶善兄作《夜雨江堤漫步記景》霞赫,讀之明凈和雅,洗練無華肥矢,欣喜拙和: 斜風(fēng)帶雨若侵衣端衰,入眼波光路欲迷。 莫看金虹明滅處...
    花屋主人蕭寒閱讀 1,507評論 29 31