arm-linux-gcc命令參數介紹

arm-linux-gcc命令參數介紹linux

 

咱們須要編譯出運行在ARM平臺上的代碼,所使用的交叉編譯器爲 arm-linux-gcc。下面將arm-linux-gcc編譯工具的一些經常使用命令參數介紹給你們。程序員

 

在此以前首先介紹下編譯器的工做過程,在使用GCC編譯程序時,編譯過程分爲四個階段:函數

1. 預處理(Pre-Processing)工具

2. 編譯(Compiling)優化

3. 彙編(Assembling)spa

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、一、二、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   儘可能與共享函數庫鏈接

相關文章
相關標籤/搜索