一.編譯過程
1.預處理,生成.i的檔案[預處理器cpp]
2.將預處理後的檔案不轉換成組合語言,生成檔案.s[編譯器egcs]
3.有彙編變為目標**(機器**)生成.o的檔案[彙編器as]
4.連線目標**,生成可執行程式[鏈結器ld]
二.引數詳解
gcc 命令的基本用法如下:
gcc [options] [filenames]
如果是c++ 直接將gcc改為g++即可。
1.預處理-pre-processing
gcc -e test.c -o test.i //.i檔案
gcc -s test.i -o test.s //.s檔案
gcc -c test.s -o test.o
gcc test.o -o test
1)-e引數
-e 選項指示編譯器僅對輸入檔案進行預處理。當這個選項被使用時, 預處理器的輸出被送到標準輸出而不是儲存在檔案裡.
2)-s引數
-s 編譯選項告訴 gcc 在為 c **產生了組合語言檔案後停止編譯。 gcc 產生的組合語言檔案的預設副檔名是 .s 。
3)-c引數
-c 選項告訴 gcc 僅把源**編譯為目標**。預設時 gcc 建立的目標**檔案有乙個 .o 的副檔名。
4)-o引數
-o 編譯選項來為將產生的可執行檔案用指定的檔名。
5)-o引數
-o 選項告訴 gcc 對源**進行基本優化。這些優化在大多數情況下都會使程式執行的更快。 -o2 選項告訴 gcc 產生盡可能小和盡可能快的**。 如-o2,-o3,-on(n 常為0–3);
-o 主要進行跳轉和延遲退棧兩種優化;
-o0 表示不做優化
-o1 為預設優化
-o2 除了完成-o1的優化之外,還進行一些額外的調整工作,如指令調整等。
-o3 則包括迴圈展開和其他一些與處理特性相關的優化工作。
選項將使編譯的速度比使用 -o 時慢, 但通常產生的**執行速度會更快。
如:
[root@localhost test]# gcc test.c -o3
[root@localhost test]# gcc -o3 test.c
[root@localhost test]# gcc -o tt test.c -o2
[root@localhost test]# gcc -o2 -o tt test.c
gcc 支援數種除錯和剖析選項,常用到的是 -g 和 -pg 。
-g 選項告訴 gcc 產生能被 gnu 偵錯程式使用的除錯資訊以便除錯你的程式。gcc 提供了乙個很多其他 c 編譯器裡沒有的特性, 在 gcc 裡你能使-g 和 -o(產生優化**)聯用。
-pg 選項告訴 gcc 在編譯好的程式裡加入額外的**。執行程式時, 產生 gprof 用的剖析資訊以顯示你的程式的耗時情況。
7) -l引數和-l引數
-l引數就是用來指定程式要鏈結的庫,-l引數緊接著就是庫名,那麼庫名跟真正的庫檔名有什麼關係呢?
就拿數學庫來說,他的庫名是m,他的庫檔名是libm.so,很容易看出,把庫檔名的頭lib和尾.so去掉就是庫名 了。
如:
gcc ***.c -lm( 動態數學庫)
-lpthread
放在/lib和/usr/lib和/usr/local/lib裡的庫直接用-l引數就能鏈結了,但如果庫檔案沒放在這三個目錄裡,而是放在其他目錄裡, 這時我們只用-l引數的話,鏈結還是會出錯,出錯資訊大概是:「/usr/bin/ld: cannot find-l***」,也就是鏈結 程式ld在那3個目錄裡找不到lib***.so,這時另外乙個引數-l就派上用場了,比如常用的x11的庫 ,它放在/usr/x11r6/lib目錄 下,我們編譯時就要用-l/usr/x11r6/lib -lx11引數,-l引數跟著的是庫檔案所在的目錄名。再比如我們把libtest.so放在/aaa/bbb/ccc目錄下,那鏈結引數就是-l/aaa/bbb/ccc -ltest
另外,大部分lib***x.so只是乙個鏈結,以rh9為例,比如libm.so它鏈結到/lib/libm.so.x,/lib/libm.so.6 又鏈結到/lib/libm-2.3.2.so,如果沒有這樣的鏈結,還是會出錯,因為ld只會找lib***x.so,所以如果你要用到***x庫,而只有lib***x.so.x或者lib***x-x.x.x.so,做乙個鏈結就可以了ln -s lib***x-x.x.x.so lib***x.so
手工來寫鏈結引數總是很麻煩的,還好很多庫開發包提供了生成鏈結引數的程式,名字一般叫***x-config,一般放在/usr/bin目錄下,比如 gtk1.2的鏈結引數生成程式是gtk-config,執行gtk-config –libs就能得到以下輸出」-l/usr/lib -l/usr/x11r6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lxi -lxext -lx11 -lm」,這就是編譯乙個gtk1.2程式所需的gtk鏈結引數,***-config除了–libs引數外還有乙個引數是–cflags用來生成標頭檔案包含目錄的,也就是-i引數,在下面我們將會講到。你可以試試執行gtk-config –libs –cflags,看看輸出結果。
現在的問題就是怎樣用這些輸出結果了,最笨的方法就是複製貼上或者照抄,聰明的辦法是在編譯命令列裡加入這個***x-config --libs --cflags
,比如編譯乙個gtk程式:gcc gtktest.cgtk-config --libs --cflags
這樣就差不多了。注意`不是單引號,而是1鍵左邊那個鍵。
除了***-config以外,現在新的開發包一般都用pkg-config來生成鏈結引數,使用方法跟***-config類似,但***-config是針對特定的開發包,但pkg-config包含很多開發包的鏈結引數的生成,用pkg-config –list-all命令可以列出所支援的所有開發包,pkg-config的用法就是pkg-config pagname –libs –cflags,其中pagname是包名,是pkg-config–list-all裡列出名單中的乙個,比如gtk1.2的名字就是gtk+, pkg-config gtk+ –libs –cflags的作用跟gtk-config –libs –cflags是一樣的。比如:
gcc gtktest.c `pkg-config gtk+ --libs --cflags`。
8) -include和-i引數
-include用來包含標頭檔案,但一般情況下包含標頭檔案都在原始碼裡用#i nclude ******實現,-include引數很少用。-i引數是用來指定頭檔案目錄,/usr/include目錄一般是不用指定的,gcc知道去那裡找,但 是如果標頭檔案不在/usr/icnclude裡我們就要用-i引數指定了,比如標頭檔案放在/myinclude目錄裡,那編譯命令列就要加上-i/myinclude 引數了,如果不加你會得到乙個」***x.h: no such file or directory」的錯誤。-i引數可以用相對路徑,比如標頭檔案在當前 目錄,可以用-i.來指定。上面我們提到的–cflags引數就是用來生成-i引數的。
9)-wall、-w 和 -v引數
-wall 列印出gcc提供的警告資訊
-w 關閉所有警告資訊
-v 列出所有編譯步驟
linux下 sort curt wc命令的使用
sort sort 命令對 file 引數指定的檔案中的行排序,並將結果寫到標準輸出。如果 file 引數指定多個檔案,那麼 sort 命令將這些檔案連線起來,並當作乙個檔案進行排序。sort語法 root www sort fbmnrtuk file or stdin 選項與引數 f 忽略大小寫的...
Linux 下的 gcc, g 編譯器
linux自帶gcc 和 g 的 gcc引數詳解 gcc and g 分別是gnu的c c 編譯器 gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 3.有彙編變為目標 機器 生成.o的檔案 4.連線目標 生成可執行程式 ...
Linux下gcc g 版本的公升級與降級
下面是我的乙個示例,我在此進行公升級操作,由原先的5.4公升級到9.1.0 1 首先安裝gcc和g 版本,依次進行如下操作 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get ins...