一、交叉編譯
? ? ? 在一個平臺上生成另一個平臺上的可執行代碼。為什么要大費周折的進行交叉編譯呢?一句話:不得已而為之。有時是因為目的平臺上不允許或不能夠安裝所需要的編譯器,而又需要這個編譯器的某些特征;有時是因為目的平臺上的資源貧乏,無法運行所需要的編譯器;有時又是因為目的平臺還沒有建立,連操作系統都沒有,根本談不上運行什么編譯器。
? ? ? 要進行交叉編譯,我們需要在主機平臺上安裝對應的交叉編譯工具鏈(cross compilation tool chain),然后用這個交叉編譯工具鏈編譯源代碼,最終生成可在目標平臺上運行的代碼。
>> --host: 編譯出來的二進制程序所執行的主機,?交叉編譯工具鏈的前綴。因為絕大多數是如果本機編譯就本機執行,所以這個值就等于build。但是交叉編譯的時候build和host需要設置不同值,用host指定運行主機,即host != build的時候編譯才是交叉編譯。若無指定將會運行`config.guess'來檢測;
>>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,來確認編譯不出現錯誤,最后提示你軟件包已經準備好,可以發布了;
step1. 下載樹莓派交叉編譯工具https://github.com/raspberrypi/tools
step2. 將源碼放到各用戶都能share的文件夾下,如/usr/tools
step3. 將交叉編譯工具的路徑加到環境變量中,為了以后啟動不用再設置,我加到了/etc/bash.bashrc中
1 $gedit /etc/bash.bashrc2 #在文件的末尾加上: export PATH=$PATH:/usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
3 $source /etc/bash.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 是否能輸出正確信息;
如果-v顯示“No such file or diectory”,?可能是32位/64位兼容問題,解決辦法:
?13.10之前版本
//安裝32位兼容庫
1 apt-get install ia32-libs
?13.10之后版本
1 $ dpkg --add-architecture i386 2 $ apt-get update 3 $ sudo apt-get install lib32z1-dev 4 $ sudo apt-get install libgtk2.0-0:i386 libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 libidn11:i386 libasound2:i386 libasound2-plugins:i386 gstreamer0.10-pulseaudio:i386 gstreamer0.10-plugins-base:i386 gstreamer0.10-plugins-good:i386 gstreamer0.10-ffmpeg:i386 5 $ sudo apt-get install ia32-libs
?
?
?
三、編譯源代碼
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
?