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、環境
Ubuntu
?
2、樹莓派交叉編譯工具安裝

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

?

轉載于:https://www.cnblogs.com/xieyajie/p/4699724.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256921.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256921.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python常用的第三方庫總結

通用 urllib -網絡庫(stdlib)。requests -網絡庫。grab – 網絡庫(基于pycurl)。pycurl – 網絡庫(綁定libcurl)。urllib3 – Python HTTP庫,安全連接池、支持文件post、可用性高。httplib2 – 網絡庫。RoboBrowser –…

ubuntu系統安裝vscode教程

方法一: 依次輸入如下命令 1、sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make 2、sudo apt-get update 3、sudo apt-get install ubuntu-make 4、umake ide visual-studio-code 提示輸入a即可 方法二: 在windows系統下載安裝包&#xff0c…

pydebugger

定義結構體from ctypes import *WORD c_ushort DWORD c_ulong LPBYTE POINTER(c_ubyte) LPTSTR POINTER(c_char) HANDLE c_void_pDEBUG_PROCESS 0x00000001 CREATE_NEW_CONSOLE 0x00000010class STARTUPINFO(Structure):_fields_ [("cb", DWORD),("lpR…

Vue2 源碼漫游(一)

Vue2 源碼漫游(一) 描述: Vue框架中的基本原理可能大家都基本了解了,但是還沒有漫游一下源碼。 所以,覺得還是有必要跑一下。 由于是代碼漫游,所以大部分為關鍵性代碼,以主線路和主要分支的代碼…

神經網絡中的反向傳播算法

神經網絡中的方向傳播算法講得復雜難懂。簡單地說明它的原理: 神經網絡:輸入層,隱藏層,輸出層。根據線性關系,激活函數,并最終根據監督學習寫出誤差表達式。此時,誤差函數可寫成,那么…

有限元筆記02:第三章

1.局部坐標到全局坐標變換 2.

bug__android studio 出現布局文件不提示,且點擊代碼不能跟蹤代碼

1,點擊布局文件,出現 Cannot find declaration to go to ? 且 點擊代碼不能跟蹤代碼? 把 項目的build.gradle 中的 compileSdkVersion 23 版本設置最高。 apply plugin: com.android.applicationandroid { compileSdkVersion 23 b…

Mysql:This version of MySQL doesn’t yet support ‘LIMIT IN/ALL/ANY/SOME 錯誤解決

This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 錯誤解決 這次國慶節回來后的測試中,在一個Mysql表達式中使用嵌套查詢,出現了這個錯誤。原因是內層select語句帶有limit子句。 在網上查了下,有文章指出&#xff…

Segmentation fault (core dumped) -llinux系統內存錯誤報錯信息

目錄 1 問題原因 (1)內存訪問越界(2)多線程程序使用了線程不安全的函數。(3)多線程讀寫的數據未加鎖保護。(5)堆棧溢出。2 使用GDB查看core文件3 使用GDB調試程序 返回目錄 1 問題…

Android 抽屜布局

目前部分APP使用一種類似抽屜式的布局,像QQ那種,感覺很炫,自己也一直想做一個像那樣的布局,(ps網上很多這樣的例子,我下面做的就是參考網上的改變的) 廢話不就不說了,直接上代碼 1、…

學習筆記(35):Python網絡編程并發編程-協程(yield,greenlet,gevent模塊)

立即學習:https://edu.csdn.net/course/play/24458/296457?utm_sourceblogtoedu 協程(yield,greenlet,gevent) 1.協程:在單線程中通過不斷地在多個任務之間進行切換執行,來達到并發的效果的線程,可以提高效率 2.yiel…

雙目標定算法

坐標系基礎知識: > 1.1. 從像素坐標系(u,v) 到 世界坐標系(Xw,Yw,Yw) 這里直接拿上篇博文的結果,中間省去了其它坐標系直接的關系,直接給出,如下所示: 公式如下: > 1.2. 符號規定( Notation ) 為了…

Spring bean三種創建方式

spring共提供了三種實例化bean的方式:構造器實例化(全類名,反射)、工廠方法(靜態工廠實例化 動態工廠實例化)和FactoryBean ,下面一一詳解: 1、構造器實例化 City.java 1 package com.proc.bean;2 3 publ…

Excel使用控件創建動態地圖圖表

[本文軟件Excel 2010] 效果圖: 首先我們看一下數據源 數據源中第二列是對應圖形的名稱。首先創建圖形,我們可能在網絡中找到各個地圖的矢量圖形。不過不是每個地圖圖形都適合我們,或許企業劃分非按照行政區劃分。因此可以嘗試自己繪制&#x…

Windows 10 常用的快捷鍵及常用指令

系統快捷鍵 快捷鍵功能說明備注CtrlShiftEsc打開任務管理器macbook: fnshiftF11普通鍵盤: PrintScreen截屏幕圖macbook: fnshiftoptionF11普通鍵盤: altPrintScreen截取當前窗口圖片macbook: WinfnEsc普通鍵盤: WinPause/Break打開系統屬性WinctrlD新建虛擬桌面Windows 10Winct…

學習筆記(35續):Python網絡編程并發編程-基于gevent及線程池實現的并發套接字通訊

1.基于線程池實現并發套接字通訊:因為套接字涉及地是I/O密集模型,因此使用多線程會有高效率 服務器 #基于線程池完成并發的套接字通訊 from socket import * from threading import Thread from concurrent.futures import ThreadPoolExecutordef commun…

使用Configuration Manager部署及管理軟件更新(2)

承接上一篇文章:http://ericxuting.blog.51cto.com/8995534/1543835 一、 確定軟件更新符合性 1. 打開Configuration Manager管理控制臺,點擊軟件庫,展開軟件更新,點擊所有軟件更新 2. 點擊主頁中的運行摘要,等待對話框…

NULL、nil、Nil、NSNull的區別

標志值含義NULL(void *)0C指針的字面零值nil(id)0Objecve-C對象的字面零值Nil(Class)0Objecve-C類的字面零值NSNull[NSNull null]用來表示零值的單獨的對象轉載于:https://www.cnblogs.com/wlsxmhz/p/56250…

Fiddler 域名過濾

原來一直沒意識到Fiddler過濾,導致每次抓包都要自己判斷、搜索好多東西,真是呵呵! 過濾設置很簡單,看懂一張圖就解決問題了。 箭頭 那兩處設置下,圓圈處保存再進行抓包即可 轉載于:https://www.cnblogs.com/eejron/p/4…

windows中VS卸載opencv配置,重新安裝其他版本

1、找到工程的屬性管理器,電機Debug64和Release64下面的 包含目錄和庫目錄,刪掉其原由配置的oepncv路徑; 找到鏈接器中的附加依賴項,刪掉原有的配置;