我們需要編譯出執行在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...