知識架構及層次 — 程式編譯及調試
嵌入式交叉編譯器安裝配置
- 主控端
執行編譯、連結嵌入式軟體的計算機
- 目标機
運作嵌入式軟體的硬體平台
- “本地”編譯器
用來生成在與編譯器本身所在的計算機和作業系統(平台)相同的環境下運作的目标代碼,例如 Windows 環境生成 Windows 目标代碼。
- 交叉編譯器
用來生成在其它平台上運作的目标代碼,例如 Windows
ARM微處理器/Linux系統下編譯器
編譯器命名規則
- arch [-vendor] [-os] [-(gnu)eabi]-工具名稱
- arch – 體系架構,如 ARM,MIPS
- vendor – 工具鍊提供商,CPU名稱或者開發闆廠商
- os – 目标作業系統,如 linux
- (gnu) eabi – 使用的庫,包括 glibc、eabi、uclibc 三種
例: arm-none-eabi-gcc
用于編譯 ARM 架構的裸機系統
例:arm-none-linux-gnueabi-gcc
用于基于 ARM 架構的 Linux 系統,基于GCC,使用 Glibc 庫
經過Codesourcery 公司優化過推出的編譯器,用于編譯 ARM 架構的 u-boot、Linux核心、linux應用等。
幾個重要目錄:
編譯器工具所在目錄:FriendlyARM/toolchain/4.9.3/bin
編譯器頭檔案所在目錄:FriendlyARM/toolchain/4.9.3/arm-cortexa9-linux-gnueabihf/sys-root/usr/include
庫檔案所在目錄:FriendlyARM/toolchain/4.9.3/arm-cortexa9-linux-gnueabihf/sys-root/usr/lib
編譯器下載下傳及安裝
可以去官網下載下傳,http://www.linaro.org/downloads/
但是速度比較慢,可以直接用我下載下傳好的。
連結: https://pan.baidu.com/s/1jL_G6kbTC9h_bF8HHXBWxw 提取碼: 67u4
1.先把下載下傳好的安裝包移動到根目錄下的tmp目錄中(/tmp)
2.使用tar指令解壓安裝包,即在Terminal中輸入以下指令:(前面的sudo表示使用root權限執行該指令)
sudo tar -xjvf /tmp/arm-linux-gcc-4.6.4-arm-x86_64.tar.bz2 -C /
注意是大寫的字母C,此指令會把安裝包解壓到根目錄下的opt的TuxamitoSoftToolchains裡面(/opt/TuxamitoSoftToolchains)
3.解壓完成後,再在(/usr/local)中建立一個新目錄arm,即在Terminal中輸入以下指令:
sudo mkdir /usr/local/arm
建立arm目錄成功後,還需要給它解放全部權限,即在Terminal中輸入以下指令:
sudo chmod 777 /usr/local/arm
4.在解壓出來的目錄中找到并把整個gcc-4.6.4目錄複制到剛剛建好的arm目錄中,指令如下:
先cd切換到gcc-4.6.4所在目錄(切換後先ls看一下有沒有gcc-4.6.4目錄):
cd /opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/
在執行 cp 複制指令,-r 表示整個目錄以及裡面的任何東西
sudo cp -r gcc-4.6.4 /usr/local/arm
5.打開(/etc/profile)配置環境變量和庫變量,目的是以後可以在任何位置使用該交叉編譯器,指令如下:
sudo vi /etc/profile
用vi或者vim打開後,在檔案最後添加兩行,并輸入以下代碼:第一行是添加執行程式的環境變量,第二行是庫檔案的路徑
export PATH=$PATH:/usr/local/arm/gcc-4.6.4/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/gcc-4.6.4/lib
然後儲存退出即可。
6.使用source指令重新加載生效該配置檔案
source /etc/profile
1
7.檢驗是否安裝成功,在 Terminal 輸入以下指令輸出版本資訊:
arm-linux-gcc -v
arm-linux-gcc工具使用
arm-linux-gcc文法形式:arm-linux-gcc [ option | filename ]...
通常情況下,産生一個新的程式需要經過四個階段:預處理、編譯、彙編,連結
當然我們可以通過參數決定該編譯操作執行到何步結束
參數繁多,在Linux環境下尋求幫助:man arm-linux -gcc
-E
- 隻對檔案進行預處理,但不進行編譯、彙編和連結。
例:arm-linux -gcc -E hello.c -o hello1.c
預處理後,hello1.c 中的内容:
-S
- 隻對檔案進行編譯(産生彙編檔案.s),但是并不進行彙編和連結。
例: arm-linux -gcc -S hello.c
上例中就會産生一個彙編檔案 hello.s
-c
隻對檔案進行編譯和彙編,但是并不進行連結,也就是說隻把程式做成 obj 檔案。
例: arm-linux -gcc -c hello.c –o hello.o
-o
指定目标名稱,預設的時候,gcc 編譯出來的檔案是 a.out
例:
arm-linux -gcc hello.c 預設編譯出 hello.out
arm-linux -gcc -o hello.bin hello.c 指定目标名詞是 hello.bin
arm-linux -gcc -o hello.s -S hello.c
-include file
包含某個代碼,簡單來說,就是編譯某個檔案時需要另一個檔案的時候,就可以用它設定,功能就相當于在代碼中使用#include。
例:arm-linux -gcc hello.c -include type.h
-I dir
如果使用#include"file"的時候,gcc/g++ 會先在目前目錄查找你所指定的頭檔案,如果沒有找到,編譯器會到預設的頭檔案目錄找;
如果使用-I指定了目錄, 編譯器會先到你所指定的目錄查找,然後再按正常的順序去找。
例: arm-linux -gcc -o hello -I/xxx/include hello.c
-I
就是取消前一個參數的功能,是以一般在-I dir之後使用
-iprefix prefix 和 -iwithprefix dir
這兩個參數一般一起使用,當-I的目錄查找失敗,會到prefix+dir下查找
-l庫名
指定編譯的時候使用的庫(靜态庫.a / 動态庫.so)
例:arm-linux-gcc -lpthread hello.c
指定用到了 phtread.c 庫
-L目錄
指定編譯的時候,搜尋庫的路徑。比如自己的庫,就可以用-L指定到你的庫所在的目錄,不然編譯器将隻在标準庫的目錄找。這個dir就是目錄的名稱。
例:arm-linux-gcc –L./ hello.c –o hello
gcc 優化
gcc 提供了為了滿足使用者不同程度的的優化需要,提供了近百種優化選項,用來對 {編譯時間,目标檔案長度,執行效率} 這個三維模型進行不同的取舍和平衡。優化的方法不一而足,總體上将有以下幾類:
精簡操作指令;
盡量滿足cpu的流水操作;
通過對程式行為的猜測,重新調整代碼的執行順序;
充分使用寄存器;
對簡單的調用進行展開等
-O0,-O1,-O2,-O3
O0:不做任何優化,這是預設的編譯選項
O3:優化級别最高
-g
- 編譯器在編譯的時候産生調試資訊。
例:arm-linux –gcc –o hello -g hello.c
課後作業
(1) 看門狗部件屬于(硬體子產品),其核心功能為(偵測軟體代碼跑飛)和(當系統“跑飛”而進入死循環時,恢複系統的運作)。
(2) 假設C程式代碼 fun.c,将其編譯成目标代碼 fun.o,編譯指令為arm-linux-gcc -c fun.c -o fun.o;如果 fun.c 使用了庫函數 libcurses.a,将其和 main.c 一起編譯成可執行檔案 smartfun,則編譯指令為arm-linux-gcc -c fun.c main.c -lcurses -o smartfun。
原文位址:https://kernel.0voice.com/forum.php?mod=viewthread&tid=1616