ARM LINUX GCC 編譯選項介紹

2022-09-16 21:48:16 字數 3403 閱讀 1100

我們需要編譯出執行在arm平台上的**,所使用的交叉編譯器為arm-linux-gcc。下面將arm-linux-gcc編譯工具的一些常用命令引數介紹給大家。在此之前首先介紹下編譯器的工作過程,在使用gcc編譯程式時,編譯過程分為四個階段:

1)      預處理(pre-processing)

2)      編譯(compiling)

3)      彙編(assembling)

4)      鏈結(linking)

linux程式設計師可以根據自己的需要讓 gcc在編譯的任何階段結束,以便檢查或使用編譯器在該階段的輸出資訊,或者對最後生成的二進位制檔案進行控制,以便通過加入不同數量和種類的除錯**來為今後的除錯做好準備。和其它常用的編譯器一樣,gcc也提供了靈活而強大的**優化功能,利用它可以生成執行效率更高的**。

以檔案example.c為例說明它的用法

1.      arm-linux-gcc -o example example.c  

不加-c、-s、-e引數,編譯器將執行預處理、編譯、彙編、連線操作直接生成可執行**。

-o引數用於指定輸出的檔案,輸出檔名為example,如果不指定輸出檔案,則預設輸出a.out

2.      arm-linux-gcc -c -o example.o example.c

-c引數將對源程式example.c進行預處理、編譯、彙編操作,生成example.0檔案

去掉指定輸出選項"-o example.o"自動輸出為example.o,所以說在這裡-o加不加都可以

3.      arm-linux-gcc -s -o example.s example.c

-s引數將對源程式example.c進行預處理、編譯,生成example.s檔案

-o選項同上

4.      arm-linux-gcc -e -o example.i example.c

-e引數將對源程式example.c進行預處理,生成example.i檔案(不同版本不一樣,有的將預處理後的內容列印到螢幕上)

就是將#include,#define等進行檔案插入及巨集擴充套件等操作。

5.      arm-linux-gcc -v -o example example.c

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

6.      arm-linux-gcc -g -o example example.c

-g選項,加入gdb能夠使用的除錯資訊,使用gdb除錯時比較方便。

7.      arm-linux-gcc -wall -o example example.c

-wall選項開啟了所有需要注意的警告資訊,像在宣告之前就使用的函式,宣告後卻沒有使用的變數等。

8.      arm-linux-gcc -ox -o example example.c

-ox使用優化選項,x的值為空、0、1、2、3

0為不優化,優化的目的是減少**空間和提高執行效率等,但相應的編譯過程時間將較長並占用較大的記憶體空間。

9.      arm-linux-gcc   -i /home/include -o example example.c

-idirname: 將dirname所指出的目錄加入到程式頭檔案目錄列表中。如果在預設系統及當前目錄中沒有找到需要的檔案,就到指定的dirname目錄中去尋找。

10.  arm-linux-gcc   -l /home/lib -o example example.c

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

11.  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 -dh**e_gdbm -dhelp_file=\"help\" cdict.c其中第乙個- d選項定義巨集h**e_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   盡量與共享函式庫連線

**:

gcc和arm linux gcc的常用選項

gcc和arm linux gcc的常用選項 gcc的使用方法 gcc 選項 檔名 gcc常用選項 v 檢視gcc編譯器的版本,顯示gcc執行時的詳細過程 o place the output into 指定輸出檔名為file,這個名稱不能跟源檔名同名 e preprocess only do no...

gcc和arm linux gcc的常用選項

gcc和arm linux gcc的常用選項 gcc的使用方法 gcc 選項 檔名 我們日常生活中所說的編譯,其實包含 1 預處理,2 編譯,3 彙編,4 鏈結這四部分 1 預處理 c c 原始檔中,以 號開頭的命令被稱為預處理命令,如包含命令 linclude 巨集定義命令 define 條件編譯...

編譯ARM Linux Gcc工具鏈!

昨天早晨就開始準備編譯工具鏈了,這樣就可以接下去學習第三章了,鬱悶的是,我編譯過程總是出錯,我就在想是不是我輸入錯誤呢,看出錯提示,也不是這種型別的啊!就停在這裡不動了。今天下午,我著重比較了一下書中的步驟,我是按部就班的,所以應該不是步驟的錯誤,它使用的是ubuntu7,而我使用的是ubuntu9...