《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 可編程邏輯 > 業(yè)界動(dòng)態(tài) > Ubuntu實(shí)現(xiàn)樹(shù)莓派交叉編譯

Ubuntu實(shí)現(xiàn)樹(shù)莓派交叉編譯

2015-09-18
關(guān)鍵詞: Ubuntu 編譯

  一,、交叉編譯
  在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)上的可執(zhí)行代碼,。為什么要大費(fèi)周折的進(jìn)行交叉編譯呢?一句話:不得已而為之,。有時(shí)是因?yàn)槟康钠脚_(tái)上不允許或不能夠安裝所需要的編譯器,,而又需要這個(gè)編譯器的某些特征;有時(shí)是因?yàn)槟康钠脚_(tái)上的資源貧乏,,無(wú)法運(yùn)行所需要的編譯器,;有時(shí)又是因?yàn)槟康钠脚_(tái)還沒(méi)有建立,連操作系統(tǒng)都沒(méi)有,,根本談不上運(yùn)行什么編譯器,。
  要進(jìn)行交叉編譯,我們需要在主機(jī)平臺(tái)上安裝對(duì)應(yīng)的交叉編譯工具鏈(cross compilation tool chain),,然后用這個(gè)交叉編譯工具鏈編譯源代碼,,最終生成可在目標(biāo)平臺(tái)上運(yùn)行的代碼。
  常見(jiàn)的交叉編譯例子如下:
  1,、在Windows PC上,,利用ADS(ARM 開(kāi)發(fā)環(huán)境),,使用armcc編譯器,則可編譯出針對(duì)ARM CPU的可執(zhí)行代碼,。
  2,、在Linux PC上,利用arm-linux-gcc編譯器,,可編譯出針對(duì)Linux ARM平臺(tái)的可執(zhí)行代碼,。
  3、在Windows PC上,,利用cygwin環(huán)境,,運(yùn)行arm-elf-gcc編譯器,可編譯出針對(duì)ARM CPU的可執(zhí)行代碼,。
  二,、名詞解釋
  Linux下的大多數(shù)軟件包都使用Autoconf/Automake工具自動(dòng)生成Makefile,只要使用“./configure”,,“make”,,“make install”就可以把程序安裝到Linux系統(tǒng)中去了。編譯第三方源代碼時(shí),,可以看下工程中的readme和install文件,,一般情況下都會(huì)寫編譯步驟。
  1,、./configure 常用參數(shù)
  [--build]
  [--host]
  [--target]
  [--prefix]
  [--help]
  注意:host和--host不是一個(gè)意思,host是指宿主機(jī),,即編輯和編譯程序的平臺(tái),,是個(gè)名詞;--host是設(shè)置執(zhí)行文件所運(yùn)行的主機(jī),,是個(gè)動(dòng)詞,。
  >> ./configure: 用來(lái)生成對(duì)應(yīng)的 Makefile;
  >> --build: 執(zhí)行代碼編譯的主機(jī),,正常的話就是你的主機(jī)系統(tǒng),。若無(wú)指定使用host的值;
  >> --host: 編譯出來(lái)的二進(jìn)制程序所執(zhí)行的主機(jī), 交叉編譯工具鏈的前綴,。因?yàn)榻^大多數(shù)是如果本機(jī)編譯就本機(jī)執(zhí)行,,所以這個(gè)值就等于build。但是交叉編譯的時(shí)候build和host需要設(shè)置不同值,,用host指定運(yùn)行主機(jī),,即host != build的時(shí)候編譯才是交叉編譯。若無(wú)指定將會(huì)運(yùn)行`config.guess"來(lái)檢測(cè),;
  >> --prefix: 安裝目錄,,比如 --prefix=/usr 意思是將該軟件安裝在 /usr 下面,,執(zhí)行文件就會(huì)安裝在 /usr/bin (而不是默認(rèn)的 /usr/local/bin),資源文件就會(huì)安裝在 /usr/share(而不是默認(rèn)的/usr/local/share);
  >> --help: 查看參數(shù),;
  >> --target: 這個(gè)參數(shù)比較特殊,,表示需要處理的目標(biāo)平臺(tái)名稱,主要在程序語(yǔ)言工具如編譯器和匯編器上下文中起作用,,若無(wú)指定使用host的值,。一般用來(lái)編譯工具,比如給arm開(kāi)發(fā)板編譯一個(gè)可以處理mips程序的gcc,那么--target=mips,;
  >>>> 舉例說(shuō)明:編譯gcc
  >> ./configure --build=i386-linux --host=arm-linux --target=mipsel-linux --prefix=$(pwd)/_install
  用i386-linux的編譯器進(jìn)行g(shù)cc的編譯,,編譯出的gcc運(yùn)行在arm-linux, 編譯結(jié)果存放到$(pwd)/_install路徑下,編譯出的gcc用來(lái)編譯能夠在mipsel-linux下運(yùn)行的代碼,。
  2,、Makefile包含了一些基本的預(yù)先定義的操作:
  >>make: 根據(jù)Makefile編譯源代碼,連接,,生成目標(biāo)文件,,可執(zhí)行文件;
  >>make clean: 清除上次的make命令所產(chǎn)生的t文件(后綴為“.o”的文件)及可執(zhí)行文件;
  >>make distclean: 類似make clean,但同時(shí)也將configure生成的文件全部刪除掉,,包括Makefile,;
  >>make test / make check: 檢查make,確保make沒(méi)有出錯(cuò),,一般在make install之前執(zhí)行,;
  >>make install: 將編譯成功的可執(zhí)行文件安裝到指定目錄中,一般為/usr/local/bin目錄;
  >>make dist: 產(chǎn)生發(fā)布軟件包文件(即distribution package),。這個(gè)命令將會(huì)將可執(zhí)行文件及相關(guān)文件打包成一個(gè)tar.gz壓縮的文件用來(lái)作為發(fā)布軟件的軟件包,。它會(huì)在當(dāng)前目錄下生成一個(gè)名字類似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,,是我們?cè)赾onfigure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION);
  >>make distcheck: 生成發(fā)布軟件包并對(duì)其進(jìn)行測(cè)試檢查,,以確定發(fā)布包的正確性。這個(gè)操作將自動(dòng)把壓縮包文件解開(kāi),,然后執(zhí)行configure命令,,并且執(zhí)行make,來(lái)確認(rèn)編譯不出現(xiàn)錯(cuò)誤,,最后提示你軟件包已經(jīng)準(zhǔn)備好,,可以發(fā)布了;
  三、交叉編譯源代碼
  1,、環(huán)境
  Ubuntu
  2,、樹(shù)莓派交叉編譯工具安裝
  step1. 下載樹(shù)莓派交叉編譯工具h(yuǎn)ttps://github.com/raspberrypi/tools
  step2. 將源碼放到各用戶都能share的文件夾下,如/usr/tools
  step3. 將交叉編譯工具的路徑加到環(huán)境變量中,,為了以后啟動(dòng)不用再設(shè)置,,我加到了bashrc中
  1 $nano ~/.bashrc 2 #在文件的末尾加上: export PATH=$PATH:/usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin 3 $source .bashrc
  step4. 檢測(cè)是否安裝成功
  way1:
  $arm #雙tab
  顯示以下內(nèi)容
  環(huán)信謝雅杰:Ubuntu實(shí)現(xiàn)樹(shù)莓派交叉編譯
  way2:
  $arm-linux-gnueabihf-gcc -v #能顯示正確信息 $arm-linux-gnueabihf-g++ -v #能顯示正確信息
  注意:交叉編譯時(shí),,如果出現(xiàn)arm-linux-gnueabihf-XXX找不到,確定arm-linux-gnueabihf-XXX -v 是否能輸出正確信息,,如果能,,可以切到root下進(jìn)行編譯
  三、編譯源代碼
  1,、在寫編譯腳本時(shí),,一定要確保編譯器寫的是交叉編譯的編譯器。比如比較常用的Makefile,
  1 demo: $(obj) 2 $(CXX) -o $@ $^ $(LDFLAGS)
  其中的CXX必須是arm-linux-gnueabihf-g++才能編譯出正確的在樹(shù)莓派上的可執(zhí)行文件,。
  2,、編譯第三方庫(kù)
  如果你想設(shè)置全局的CC和CXX變量,在每次打開(kāi)一個(gè)新的Terminal時(shí),,輸入以下命令:
  1 $export CC=arm-linux-gnueabihf-gcc 2 $export CXX=arm-linux-gnueabihf-g++
  其他的全局變量同上,。
  以下列幾個(gè)常用的第三方庫(kù)交叉編譯步驟
  1>> sqlite3   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
  step1: ./config no-asm shared --prefix=/usr/local/tools/openssl
  step2: a、修改Makefile CC=arm-linux-gnueabihf-gcc
  b,、找到有-m64的地方,,將-m64刪除。
  step3: make

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118,;郵箱:[email protected]