嵌入式C語言編譯器:GCC
1 GCC相關介紹
GCC與gcc有什麼不同?
- GCC(GNU Compiler Collection)
- GNU編譯器集合,包含眾多語言的編譯器:C、C++、Java、D、Objective-C、etc
- gcc:特指GCC中的C語言編譯器
GCC VS 嵌入式
- 多數嵌入式作業系統都基於GCC進行原始碼編譯
- Linux、VxWorks、Android、etc
- 實際開發中的應用
- 核心開發:gcc
- 應用開發:gcc / g++ / gdc
2 初識編譯器
- gcc將程式碼編譯成可執行程式的過程會完成預處理(preprocessing)、編譯(compilation)、彙編(assembly)、連結(linking)四個步驟
- 編譯器由前處理器(cpp工具,C Preprocessor)、編譯器(cc工具,C and C++ compiler)、彙編器(as工具,assembler)、聯結器(ld工具)組成
3 gcc關鍵編譯選項
3.1 預處理指令
3.1.1 指令格式
gcc -E file.c -o file.i
3.1.2 預處理檔案相關內容
從file.i檔案中我們可以看到存在大量的以“#”開頭的行。每行的格式是“# 行號 檔名 標誌“,其中的”行號“與”檔名“表示從它後一行開始的內容來源於哪一個檔案的哪一行;標誌可以是1、2、3和4四個數字,每個數字的含義如下:
數字 | 含義 |
---|---|
1 | 表示一個新檔案的開始 |
2 | 表示從一個被包含的檔案中返回 |
3 | 表示後面的內容來自於系統標頭檔案 |
4 | 表示後面的內容應當被當作一個隱式的’extern “C”’塊 |
當file.c使用到非系統標頭檔案且它們不在當前目錄下時,需要通過使用gcc的-I引數加以指定,否則gcc會因為無法獲得必要的標頭檔案進行巨集展開而報錯。
3.2 編譯指令
3.2.1 指令格式
gcc -S file.i -o file.s
gcc -S -O2 file.c -o file.s
3.2.2 說明
使用-S引數時,我們可以根據需要使用-O選項。
3.3 彙編指令
3.3.1 指令格式
gcc -c file.s -o file.o
3.4 生成對映檔案
3.4.1 指令格式
gcc -Wl,-Map=file.map file.c
3.4.2 說明
對映檔案是通過ld連結器來生成的,我們可以通過對映檔案瞭解一個程式檔案中各符號在記憶體中的佈局資訊。gcc的-Wl選項用於指定傳遞給連結器的選項,-Map=file.map選項由gcc傳遞給連結器以指示連結器為我們生成名為file.map的對映檔案。在使用-Wl選項時,它後面的選項如有多個則需要用逗號加以分割。
3.5 巨集定義
3.5.1 指令格式
gcc -D'TEST="test"' file.c
3.5.2 說明
如果巨集為字串時,則需要用單引號引起來。
3.6 獲取系統標頭檔案路徑
3.6.1 指令格式
gcc -v file.c
3.6.2 說明
系統標頭檔案是指C語言本身和作業系統相關的標頭檔案。在使用-v選項獲取系統標頭檔案路徑時,必須後面帶一個有效的C程式原始檔,否則gcc輸出的資訊將不包含系統標頭檔案路徑這一內容。
3.7 生成依賴關係
3.7.1 指令格式
獲取目標的完整依賴關係:
gcc -M test.c
獲取目標的部分依賴關係:
gcc -MM test.c
3.7.2 說明
由於系統標頭檔案在絕大多數情形下是不會改變的,因此在構造make所需的依賴關係時不必將它們納入其中。通過-MM選項,可以讓gcc生成不包含系統標頭檔案的依賴關係。
3.8 指定庫檔案及庫檔案搜尋路徑
3.8.1 指令格式
-L選項:指定庫檔案的搜尋路徑
-l選項:指定庫檔案
ar crs libfunc.a func.o
gcc test.c -L. -lfunc
3.8.2 說明
注意,-L選項用於告訴gcc可以從哪個目錄查詢庫檔案,可以多次使用它以指定多個目錄;-I選項則用於告訴gcc在生成可執行程式時需要連結的庫名,這一選項同樣可以多次使用以指定多個庫。使用-l選項時要注意後面所跟的名字並不包括“lib”字首和“.a”字尾。
修改記錄
時間 | 動作 |
---|---|
2017.6.9 | 首次上傳 |
參考資料
唐老師 — 狄泰軟體學院 — 十二月提升計劃
李雲 — 《專業嵌入式軟體開發 全面走向高質量程式設計》