//======================================================
gcc和Linux gcc 的常用選項(xiàng)
gcc的使用方法
gcc 【選項(xiàng)】 文件名
gcc常用選項(xiàng)
gcc
-v: 查看gcc編譯器的版本,顯示gcc執(zhí)行時(shí)的詳細(xì)過(guò)程
-o<file> please the output into <file>
指定文件名為file,這個(gè)名稱(chēng)不能和源文件名相同
-E preprocess only :do not compile ,assemble or link
只預(yù)處理 ,不會(huì)編譯,匯編,鏈接
-S compile only:do not assemble or link
只編譯,不會(huì)編譯,匯編,鏈接
//==============================================================
gcc -v :查看gcc編譯器的版本
方式一:
gcc hello.c 輸出一個(gè)./a.out,然后./a.out來(lái)執(zhí)行這個(gè)應(yīng)用程序。
gcc -o hello hello.c 輸出hello ,然后./hello 來(lái)執(zhí)行這個(gè)程序。
方式二:
gcc -E -o hello.i hello.c
gcc -S -o hello.s hello.i
gcc -c -o hello.o hello.s
gcc -o hello hello.o
.o:objet file (OBJ文件)
小結(jié):
1)輸入文件的后綴名和選項(xiàng)共同決定gcc到底執(zhí)行哪些操作
2)在編譯過(guò)程中,除非是使用了-E,-S,-c選項(xiàng)(或者編譯過(guò)程中出錯(cuò)阻止了編譯過(guò)程否則最后的步驟都是鏈接)
方式三:
gcc -c -o hello.o hello.c
gcc -o hello hello
gcc 會(huì)對(duì).c文件默認(rèn)進(jìn)行預(yù)處理操作,-c再來(lái)指明編譯,匯編,從而得到了.o文件
再來(lái)通過(guò)gcc -o hello hello.o 將.o文件進(jìn)行鏈接,得到可執(zhí)行應(yīng)用程序
//======================================================
補(bǔ)充:
gcc -c -o hello.o hello.c
gcc -o hello hello.o
gcc會(huì)對(duì).c文件默認(rèn)進(jìn)行預(yù)處理操作,-c再來(lái)指明編譯,匯編從而得到.o文件
再通過(guò)gcc -o hello hello.o將.o文件進(jìn)行鏈接,從而得到可執(zhí)行文件
鏈接就是將匯編生成的OBJ文件,系統(tǒng)庫(kù)的OBJ文件,庫(kù)文件鏈接起來(lái)
最終生成可以在特定平臺(tái)的可執(zhí)行程序
crtl.o ,crti.o ,crtbegin.o , crth.o是加入的系統(tǒng)標(biāo)準(zhǔn)啟動(dòng)文件
對(duì)于一般的應(yīng)用程序,這些啟動(dòng)是必須的
-lc :鏈接libc庫(kù)文件, 其中l(wèi)ibc庫(kù)文件中就實(shí)現(xiàn)了printf等函數(shù)
gcc -v -nostdlib -o hello hello.o會(huì)提示因?yàn)闆](méi)有鏈接系統(tǒng)標(biāo)準(zhǔn)啟動(dòng)文件和標(biāo)準(zhǔn)庫(kù)文件,而鏈接失敗。
這個(gè) -nostdlib選項(xiàng)常用于裸機(jī)的/boot loader,linux內(nèi)核等程序,因?yàn)樗麄儾恍枰獑?dòng)文件,標(biāo)準(zhǔn)庫(kù)文件
一般應(yīng)用程序才需要系統(tǒng)標(biāo)準(zhǔn)啟動(dòng)文件和標(biāo)準(zhǔn)庫(kù)文件
裸機(jī)/boot loader,linux內(nèi)核等不需要啟動(dòng)文件,標(biāo)準(zhǔn)庫(kù)文件
動(dòng)態(tài)鏈接使用動(dòng)態(tài)鏈接庫(kù)進(jìn)行鏈接,生成的程序執(zhí)行的時(shí)候需要加載所需的動(dòng)態(tài)庫(kù)才能運(yùn)行
動(dòng)態(tài)鏈接生成的程序體積較小,但是必須依賴(lài)所需要的動(dòng)態(tài)庫(kù),否則無(wú)法執(zhí)行
靜態(tài)鏈接使用靜態(tài)庫(kù)進(jìn)行鏈接,生成的程序包含程序運(yùn)行所需要的全部庫(kù),可以直接運(yùn)行,
不過(guò)靜態(tài)鏈接生成的程序體積較大
|