Linux下gcc與g++用法以及編寫makefile
來源:http://huobumingbai.blog.51cto.com/1196746/308526
(本文主要以gcc為演示,如果是C++程序直接將給 gcc改為g++即可)
1. gcc與g++編譯流程:
1) 編譯流程:
2) 預(yù)處理:生成.i的預(yù)處理文件。
Ø 只激活預(yù)處理,這個不生成文件,需要把它重定向一個輸出文件。
Ø 演示:
3) 編譯:生成.s的編譯文件。
Ø 只激活預(yù)處理和編譯,把文件編譯成匯編代碼。
Ø 演示:
4) 匯編:生成.o的匯編文件。
Ø 只激活預(yù)處理、編譯和匯編,把程序做成obj文件。
Ø 演示:
5) 鏈接:生成鏈接文件。
Ø 激活預(yù)處理、編譯、匯編和鏈接。
Ø 演示:
6) 慣用:
2. gcc與g++常用參數(shù)介紹:
1) -E
Ø -E選項(xiàng)指示編譯器僅對輸入文件進(jìn)行預(yù)處理。當(dāng)這個選項(xiàng)被使用時,預(yù)處理器的輸出被送到標(biāo)準(zhǔn)輸出而不是儲存在文件里。
Ø 演示:
2) -S
Ø -S選項(xiàng)告訴GCC在為C代碼產(chǎn)生了匯編語言文件后停止編譯。GCC產(chǎn)生的匯編語言文件的缺省擴(kuò)展名是.s。
Ø 演示:
3) -c
Ø -c選項(xiàng)告訴GCC僅把源代碼編譯為目標(biāo)代碼。缺省時GCC建立的目標(biāo)代碼文件有一個.o的擴(kuò)展名。
Ø 演示:
4) -o
Ø -o選項(xiàng)來為將產(chǎn)生的可執(zhí)行文件用指定的文件名。
Ø 演示:
5) -O
Ø -O選項(xiàng)告訴GCC對源代碼進(jìn)行基本優(yōu)化,這些優(yōu)化在大多數(shù)情況下都會使程序執(zhí)行的更快,優(yōu)化分為4個等級(-O0,-O1,-O2,-O3)。
-O0表示沒有優(yōu)化。
-O1為缺省值,主要進(jìn)行跳轉(zhuǎn)和延遲退棧兩種優(yōu)化。
-O2除了完成-O1的優(yōu)化之外,還進(jìn)行一些額外的指令調(diào)整工作。
-O3除了完成-O2的優(yōu)化之外,還進(jìn)行包括循環(huán)展開和其他一些與處理特性相關(guān)的優(yōu)化工作。
Ø 演示:
其他優(yōu)化等級的用法與演示中-O3的用法一樣。
6) -x
Ø 設(shè)定文件編譯所使用的語言,使后綴名無效。
Ø 演示:
7) -C
Ø 在預(yù)處理的時候,不刪除注釋信息。
Ø 演示:
8) -M
Ø 生成文件關(guān)聯(lián)信息。包含目標(biāo)文件所依賴的所有源代碼。
Ø 演示:
2. 編寫makefile:
1) 編寫一個程序:
Ø 共5個文件,3個.cpp文件,2個.h文件。
Ø main.cpp:
Ø printf1.cpp:
Ø printf1.h:
Ø printf2.cpp:
Ø printf2.h:
Ø 常規(guī)編譯:
l 匯編main.cpp:
l 匯編printf1.cpp
l 匯編printf2.cpp
l 將3個obj文件鏈接到一個文件上:
l 運(yùn)行:
l 總共生成的文件:
2) 運(yùn)用makefile文件:
Ø 優(yōu)點(diǎn):
由上例可知,照這樣的編譯方法,如果是一個項(xiàng)目的話,可能存在上百個文件,豈不是太麻煩了,所以要把編譯過程寫進(jìn)一個文件中:makefile。
Ø 編寫規(guī)則:
l 以#號開始的為注釋
l 具體編譯過程:
對象:依賴項(xiàng)
編譯方式
l makefile文本向右縮進(jìn)時使用TAB鍵,不能用空格代替。
Ø 編寫(以上面得程序?yàn)槔?:
l 創(chuàng)建makefile文件:
l 編寫makefile文件:
u 常用寫法:
前三行類似一個變量的定義,取值時使用$(定義值)來取值。
u 也可以寫成:
等價于上面的寫法,缺點(diǎn)是文件一旦過多,修改也不容易。
l 運(yùn)行makefile文件:
l 生成的文件:
l 運(yùn)行目標(biāo)文件:
l 刪除生成文件: