1. 程式人生 > >arm-linux-gcc 常用引數講解 gcc編譯器使用方法

arm-linux-gcc 常用引數講解 gcc編譯器使用方法

我們需要編譯出執行在ARM平臺上的程式碼,所使用的交叉編譯器為 arm-linux-gcc。下面將arm-linux-gcc編譯工具的一些常用命令引數介紹給大家。
在此之前首先介紹下編譯器的工作過程,在使用GCC編譯程式時,編譯過程分為四個階段:
1. 預處理(Pre-Processing)
2. 編譯(Compiling)
3. 彙編(Assembling)
4. 連結(Linking)
Linux程式設計師可以根據自己的需要讓 GCC在編譯的任何階段結束,以便檢查或使用編譯器在該階段的輸出資訊,或者對最後生成的二進位制檔案進行控制,以便通過加入不同數量和種類的除錯程式碼來為 今後的除錯做好準備。和其它常用的編譯器一樣,GCC也提供了靈活而強大的程式碼優化功能,利用它可以生成執行效率更高的程式碼。

以檔案example.c為例說明它的用法
0. arm-linux-gcc -o example example.c
   不加-c、-S、-E引數,編譯器將執行預處理、編譯、彙編、連線操作直接生成可執行程式碼。
    -o引數用於指定輸出的檔案,輸出檔名為example,如果不指定輸出檔案,則預設輸出a.out

1. arm-linux-gcc -c -o example.o example.c
   -c引數將對源程式example.c進行預處理、編譯、彙編操作,生成example.o檔案
   去掉指定輸出選項"-o example.o"自動輸出為example.o,所以說在這裡-o加不加都可以

2.arm-linux-gcc -S -o example.s example.c
   -S引數將對源程式example.c進行預處理、編譯,生成example.s檔案
   -o選項同上

3.arm-linux-gcc -E -o example.i example.c
   -E引數將對源程式example.c進行預處理,生成example.i檔案(不同版本不一樣,有的將預處理後的內容列印到螢幕上)
   就是將#include,#define等進行檔案插入及巨集擴充套件等操作。
  
4.arm-linux-gcc

 -v -o example example.c
加上-v引數,顯示編譯時的詳細資訊,編譯器的版本,編譯過程等。

5.arm-linux-gcc -g -o example example.c
-g選項,加入GDB能夠使用的除錯資訊,使用GDB除錯時比較方便。

6.arm-linux-gcc -Wall -o example example.c
-Wall選項打開了所有需要注意的警告資訊,像在宣告之前就使用的函式,聲明後卻沒有使用的變數等。

7.arm-linux-gcc -Ox -o example example.c
-Ox使用優化選項,X的值為空、0、1、2、3
0為不優化,優化的目的是減少程式碼空間和提高執行效率等,但相應的編譯過程時間將較長並佔用較大的記憶體空間。

8.arm-linux-gcc   -I /home/include -o example example.c
-Idirname: 將dirname所指出的目錄加入到程式標頭檔案目錄列表中。如果在預設系統及當前目錄中沒有找到需要的檔案,就到指定的dirname目錄中去尋找。

9.arm-linux-gcc   -L /home/lib -o example example.c

-Ldirname:將dirname所指出的目錄加入到庫檔案的目錄列表中。在預設狀態下,連線程式ld在系統的預設路徑中(如/usr/lib)尋找所需要的庫檔案,這個選項告訴連線程式,首先到-L指定的目錄中去尋找,然後再到系統預設路徑中尋找。

10.arm-linux-gcc –static -o libexample.a example.c

靜態連結庫檔案

 

gcc在命令列上經常使用的幾個選項是:
-c   只預處理、編譯和彙編源程式,不進行連線。編譯器對每一個源程式產生一個目標檔案。

-o file  確定輸出檔案為file。如果沒有用-o選項,預設的可執行檔案的輸出是a.out,目標檔案和彙編檔案的輸出對source.suffix分別是source.o和source.s,預處理的C源程式的輸出是標準輸出stdout。

-Dmacro 或-Dmacro=defn   其作用類似於源程式裡的#define。例如:% gcc -c -DHAVE_GDBM -DHELP_FILE=\"help\" cdict.c其中第一個- D選項定義巨集HAVE_GDBM,在程式裡可以用#ifdef去檢查它是否被設定。第二個-D選項將巨集HELP_FILE定義為字串“help”(由於 反斜線的作用,引號實際上已成為該巨集定義的一部分),這對於控制程式開啟哪個檔案是很有用的。

-Umacro   某些巨集是被編譯程式自動定義的。這些巨集通常可以指定在其中進行編譯的計算機系統型別的符號,使用者可以在編譯某程式時加上 -v選項以檢視gcc預設定義了哪些巨集。如果使用者想取消其中某個巨集定義,用-Umacro選項,這相當於把#undef macro放在要編譯的原始檔的開頭。

-Idir   將dir目錄加到搜尋標頭檔案的目錄列表中去,並優先於在gcc預設的搜尋目錄。在有多個-I選項的情況下,按命令列上-I選項的前後順序搜尋。dir可使用相對路徑,如-I../inc等。

-O   對程式編譯進行優化,編譯程式試圖減少被編譯程式的長度和執行時間,但其編譯速度比不做優化慢,而且要求較多的記憶體。

-O2   允許比-O更好的優化,編譯速度較慢,但結果程式的執行速度較快。

-g   產生一張用於除錯和排錯的擴充套件符號表。-g選項使程式可以用GNU的除錯程式GDB進行除錯。優化和除錯通常不相容,同時使用-g和-O(-O2)選項經常會使程式產生奇怪的執行結果。所以不要同時使用-g和-O(-O2)選項。

-fpic或-fPIC   產生位置無關的目的碼,可用於構造共享函式庫。

以 上是gcc的編譯選項。gcc的命令列上還可以使用連線選項。事實上,gcc將所有不能識別的選項傳遞給連線程式ld。連線程式ld將幾個目標檔案和庫程 序組合成一個可執行檔案,它要解決對外部變數、外部過程、庫程式等的引用。但我們永遠不必要顯式地呼叫ld。利用gcc命令去連線各個檔案是很簡單的,即 使在命令列裡沒有列出庫程式,gcc也能保證某些庫程式以正確的次序出現。

gcc的常用連線選項有下列幾個:
-Ldir   將dir目錄加到搜尋-l選項指定的函式庫檔案的目錄列表中去,並優先於gcc預設的搜尋目錄。在有多個-L選項的情況下,按命令列上-L選項的前後順序搜尋。dir可使用相對路徑。如-L../lib等。

-lname   在連線時使用函式庫libname.a,連線程式在-Ldir選項指定的目錄下和/lib,/usr/lib目錄下尋找該庫檔案。在沒有使用-static選項時,如果發現共享函式庫libname.so,則使用libname.so進行動態連線。

-static   禁止與共享函式庫連線。

-shared   儘量與共享函式庫連線