天天看點

「嵌入式」Linux開發工具arm-linux-gcc安裝及使用

知識架構及層次 — 程式編譯及調試

「嵌入式」Linux開發工具arm-linux-gcc安裝及使用

嵌入式交叉編譯器安裝配置

「嵌入式」Linux開發工具arm-linux-gcc安裝及使用
  • 主控端

執行編譯、連結嵌入式軟體的計算機

  • 目标機

運作嵌入式軟體的硬體平台

  • “本地”編譯器

用來生成在與編譯器本身所在的計算機和作業系統(平台)相同的環境下運作的目标代碼,例如 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

「嵌入式」Linux開發工具arm-linux-gcc安裝及使用

編譯器頭檔案所在目錄: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           

然後儲存退出即可。

「嵌入式」Linux開發工具arm-linux-gcc安裝及使用

6.使用source指令重新加載生效該配置檔案

source /etc/profile
1           

7.檢驗是否安裝成功,在 Terminal 輸入以下指令輸出版本資訊:

arm-linux-gcc -v           
「嵌入式」Linux開發工具arm-linux-gcc安裝及使用

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

「嵌入式」Linux開發工具arm-linux-gcc安裝及使用

預處理後,hello1.c 中的内容:

「嵌入式」Linux開發工具arm-linux-gcc安裝及使用

-S

  • 隻對檔案進行編譯(産生彙編檔案.s),但是并不進行彙編和連結。

例: arm-linux -gcc -S hello.c

上例中就會産生一個彙編檔案 hello.s

「嵌入式」Linux開發工具arm-linux-gcc安裝及使用

-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之後使用

「嵌入式」Linux開發工具arm-linux-gcc安裝及使用

-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

「嵌入式」Linux開發工具arm-linux-gcc安裝及使用

gcc 優化

gcc 提供了為了滿足使用者不同程度的的優化需要,提供了近百種優化選項,用來對 {編譯時間,目标檔案長度,執行效率} 這個三維模型進行不同的取舍和平衡。優化的方法不一而足,總體上将有以下幾類:

精簡操作指令;

盡量滿足cpu的流水操作;

通過對程式行為的猜測,重新調整代碼的執行順序;

充分使用寄存器;

對簡單的調用進行展開等

-O0,-O1,-O2,-O3

O0:不做任何優化,這是預設的編譯選項

O3:優化級别最高

-g

  • 編譯器在編譯的時候産生調試資訊。

例:arm-linux –gcc –o hello -g hello.c

「嵌入式」Linux開發工具arm-linux-gcc安裝及使用

課後作業

(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

繼續閱讀