2021-05-12 14:32:11
Ubuntu實現樹莓派交叉編譯
一、交叉編譯
在一個平台上生成另一個平台上的可執行程式碼。為什麼要大費周折的進行交叉編譯呢?一句話:不得已而為之。有時是因為目的平台上不允許或不能夠安裝所需要的編譯器,而又需要這個編譯器的某些特徵;有時是因為目的平台上的資源貧乏,無法執行所需要的編譯器;有時又是因為目的平台還沒有建立,連作業系統都沒有,根本談不上執行什麼編譯器。
要進行交叉編譯,我們需要在主機平台上安裝對應的交叉編譯工具鏈(cross compilation tool chain),然後用這個交叉編譯工具鏈編譯原始碼,最終生成可在目標平台上執行的程式碼。
常見的交叉編譯例子如下:
1、在Windows PC上,利用ADS(ARM 開發環境),使用armcc編譯器,則可編譯出針對ARM CPU的可執行程式碼。
2、在Linux PC上,利用arm-linux-gcc編譯器,可編譯出針對Linux ARM平台的可執行程式碼。
3、在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包含了一些基本的預先定義的操作:
>>make: 根據Makefile編譯原始碼,連線,生成目標檔案,可執行檔案;
>>make clean: 清除上次的make命令所產生的object檔案(字尾為“.o”的檔案)及可執行檔案;
>>make distclean: 類似make clean,但同時也將configure生成的檔案全部刪除掉,包括Makefile;
>>make test / make check: 檢查make,確保make沒有出錯,一般在make install之前執行;
>>make install: 將編譯成功的可執行檔案安裝到指定目錄中,一般為/usr/local/bin目錄;
>>make dist: 產生發布軟體包檔案(即distribution package)。這個命令將會將可執行檔案及相關檔案打包成一個tar.gz壓縮的檔案用來作為發布軟體的軟體包。它會在當前目錄下生成一個名字類似“PACKAGE-VERSION.tar.gz”的檔案。PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION);
>>make distcheck: 生成發布軟體包並對其進行測試檢查,以確定發布包的正確性。這個操作將自動把壓縮包檔案解開,然後執行configure命令,並且執行make,來確認編譯不出現錯誤,最後提示你軟體包已經準備好,可以發布了;
三、交叉編譯原始碼
1、環境
2、樹莓派交叉編譯工具安裝
step1. 下載樹莓派交叉編譯工具https://github.com/raspberrypi/tools
step2. 將原始碼放到各使用者都能share的資料夾下,如/usr/tools
step3. 將交叉編譯工具的路徑加到環境變數中,為了以後啟動不用再設定,我加到了bashrc中
1 $nano ~/.bashrc
2 #在檔案的末尾加上: export PATH=$PATH:/usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
3 $source .bashrc
step4. 檢測是否安裝成功
way1:
$arm #雙tab
顯示以下內容
way2:
$arm-linux-gnueabihf-gcc -v
#能顯示正確資訊
$arm-linux-gnueabihf-g++ -v
#能顯示正確資訊
注意:交叉編譯時,如果出現arm-linux-gnueabihf-XXX找不到,確定arm-linux-gnueabihf-XXX -v 是否能輸出正確資訊,如果能,可以切到root下進行編譯
三、編譯原始碼
1、在寫編譯指令碼時,一定要確保編譯器寫的是交叉編譯的編譯器。比如比較常用的Makefile,
1 demo: $(obj)
2 $(CXX) -o $@ $^ $(LDFLAGS)
其中的CXX必須是arm-linux-gnueabihf-g++才能編譯出正確的在樹莓派上的可執行檔案。
2、編譯第三方庫
如果你想設定全域性的CC和CXX變數,在每次開啟一個新的Terminal時,輸入以下命令:
1 $export CC=arm-linux-gnueabihf-gcc
2 $export CXX=arm-linux-gnueabihf-g++
其他的全域性變數同上。
以下列幾個常用的第三方庫交叉編譯步驟
1>> sqlite3 http://www.sqlite.org/download.html 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 http://curl.haxx.se/download.html 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: http://www.openssl.org/source/ 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
在(Raspberry Pi)樹莓派上安裝NodeJS http://www.linuxidc.com/Linux/2015-01/111714.htm
Raspberry Pi 樹莓派上安裝Weston http://www.linuxidc.com/Linux/2013-06/86685.htm
用於Raspberry Pi 的Linux 作業系統已經可用 http://www.linuxidc.com/Linux/2012-03/56058.htm
Raspberry Pi(樹莓派)試用小記 http://www.linuxidc.com/Linux/2013-10/91008.htm
Raspberry Pi(樹莓派)的安裝、設定IP及軟體源等入門 http://www.linuxidc.com/Linux/2013-10/91009.htm
相關文章