Ubuntu實現樹莓派交叉編譯

2021-08-10 19:34:01 字數 3790 閱讀 6992

一、交叉編譯

在乙個平台上生成另乙個平台上的可執行**。為什麼要大費周折的進行交叉編譯呢?一句話:不得已而為之。有時是因為目的平台上不允許或不能夠安裝所需要的編譯器,而又需要這個編譯器的某些特徵;有時是因為目的平台上的資源貧乏,無法執行所需要的編譯器;有時又是因為目的平台還沒有建立,連作業系統都沒有,根本談不上執行什麼編譯器。

要進行交叉編譯,我們需要在主機平台上安裝對應的交叉編譯工具鏈(cross compilation tool chain),然後用這個交叉編譯工具鏈編譯源**,最終生成可在目標平台上執行的**。

常見的交叉編譯例子如下:

在windows pc上,利用ads(arm 開發環境),使用armcc編譯器,則可編譯出針對arm cpu的可執行**。

在linux pc上,利用arm-linux-gcc編譯器,可編譯出針對linux arm平台的可執行**。

在windows pc上,利用cygwin環境,執行arm-elf-gcc編譯器,可編譯出針對arm cpu的可執行**。

二、名詞解釋

linux下的大多數軟體包都使用autoconf/automake工具自動生成makefile,只要使用「./configure」,「make」,「make install」就可以把程式安裝到linux系統中去了。編譯第三方源**時,可以看下工程中的readme和install檔案,一般情況下都會寫編譯步驟。

1、./configure 常用引數[--build] | [--host] | [--target] | [--prefix] | [--help]

注意:host和--host不是乙個意思,host是指宿主機,即編輯和編譯程式的平台,是個名詞;--host是設定執行檔案所執行的主機,是個動詞。

>> ./configure: 用來生成對應的 makefile;

>> --build: 執行**編譯的主機,正常的話就是你的主機系統。若無指定使用host的值;

>> --host: 編譯出來的二進位制程式所執行的主機, 交叉編譯工具鏈的字首。因為絕大多數是如果本機編譯就本機執行,所以這個值就等於build。但是交叉編譯的時候build和host需要設定不同值,用host指定執行主機,即host != build的時候編譯才是交叉編譯。若無指定將會執行`config.guess'來檢測;

>> --prefix: 安裝目錄,比如 --prefix=/usr 意思是將該軟體安裝在 /usr 下面,執行檔案就會安裝在 /usr/bin (而不是預設的 /usr/local/bin),資源檔案就會安裝在 /usr/share(而不是預設的/usr/local/share);

>> --help: 檢視引數;

>> --target: 這個引數比較特殊,表示需要處理的目標平台名稱,主要在程式語言工具如編譯器和彙編器上下文中起作用,若無指定使用host的值。一般用來編譯工具,比如給arm開發板編譯乙個可以處理mips程式的gcc,那麼--target=mips;

>>>> 舉例說明:編譯gcc

>> ./configure --build=i386-linux --host=arm-linux --target=mipsel-linux --prefix=$(pwd)/_install

用i386-linux的編譯器進行gcc的編譯,編譯出的gcc執行在arm-linux, 編譯結果存放到$(pwd)/_install路徑下,編譯出的gcc用來編譯能夠在mipsel-linux下執行的**。

2、makefile包含了一些基本的預先定義的操作:

三、交叉編譯源**

1、環境

ubuntu

2、樹莓派交叉編譯工具安裝step

step2. 將原始碼放到各使用者都能share的資料夾下,如/usr/tools

step3. 將交叉編譯工具的路徑加到環境變數中,為了以後啟動不用再設定,我加到了bashrc中

1

23

1 $nano ~/.bashrc

2 #在檔案的末尾加上: export path=$path:/usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

3 $source .bashrc

step4. 檢測是否安裝成功

way1:

1
$arm #雙tab
顯示以下內容

#能顯示正確資訊

$arm-linux-gnueabihf-g++

-v #能顯示正確資訊

注意:交叉編譯時,如果出現arm-linux-gnueabihf-***找不到,確定arm-linux-gnueabihf-*** -v 是否能輸出正確資訊,如果能,可以切到root下進行編譯

三、編譯源**

1、在寫編譯指令碼時,一定要確保編譯器寫的是交叉編譯的編譯器。比如比較常用的makefile,

1

2

1 demo: $(obj)

2 $(cxx)

-o $@ $^ $(ldflags)

其中的cxx必須是arm-linux-gnueabihf-g++才能編譯出正確的在樹莓派上的可執行檔案。

2、編譯第三方庫

如果你想設定全域性的cc和cxx變數,在每次開啟乙個新的terminal時,輸入以下命令:

1

2

1 $export cc=arm-linux-gnueabihf-gcc  

2 $export cxx=arm-linux-gnueabihf-g++

以下列幾個常用的第三方庫交叉編譯步驟1>>sqlite3 sqlite-autoconf-3081002.tar.gz

step1: make clean

step2: ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/tools/sqlite3

step3: make

step4: make install

2>>curl curl-7.43.0.tar.gz

step1: make clean

step2: ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/tools/curl

step3: make

step4: make install

3>>openssl: openssl-1.0.1p.tar.gz

step1: ./config no-asm shared --prefix=/usr/local/tools/openssl

step2: a、修改makefile cc=arm-linux-gnueabihf-gcc

b、找到有-m64的地方,將-m64刪除。

step3: make

step4: make install

Ubuntu實現樹莓派交叉編譯

一 交叉編譯 在乙個平台上生成另乙個平台上的可執行 為什麼要大費周折的進行交叉編譯呢?一句話 不得已而為之。有時是因為目的平台上不允許或不能夠安裝所需要的編譯器,而又需要這個編譯器的某些特徵 有時是因為目的平台上的資源貧乏,無法執行所需要的編譯器 有時又是因為目的平台還沒有建立,連作業系統都沒有,根...

Ubuntu實現樹莓派交叉編譯

一 交叉編譯 在乙個平台上生成另乙個平台上的可執行 為什麼要大費周折的進行交叉編譯呢?一句話 不得已而為之。有時是因為目的平台上不允許或不能夠安裝所需要的編譯器,而又需要這個編譯器的某些特徵 有時是因為目的平台上的資源貧乏,無法執行所需要的編譯器 有時又是因為目的平台還沒有建立,連作業系統都沒有,根...

在ubuntu交叉編譯 樹莓派

交叉編譯是在乙個平台上生成另乙個平台上的可執行 比如 1.我們再windows上面編寫c51 並編譯成可執行 如xx.hex,是在c51上面執行,不是在windows上面執行 2.我們在ubuntu上面編寫樹莓派的 並編譯成可執行 如a.out,是在樹莓派上面執行,不是在ubuntu linux上面...