Ubuntu实现树莓派交叉编译

1、交叉编译html

      在一个平台上生成另外一个平台上的可执行代码。为何要大费周折的进行交叉编译呢?一句话:不得已而为之。有时是由于目的平台上不容许或不可以安装所须要的编译器,而又须要这个编译器的某些特征;有时是由于目的平台上的资源贫乏,没法运行所须要的编译器;有时又是由于目的平台尚未创建,连操做系统都没有,根本谈不上运行什么编译器。
linux

      要进行交叉编译,咱们须要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),而后用这个交叉编译工具链编译源代码,最终生成可在目标平台上运行的代码。git

     常见的交叉编译例子以下:
一、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
二、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
三、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。
 
2、名词解释
 
Linux下的大多数软件包都使用Autoconf/Automake工具自动生成Makefile,只要使用“./configure”,“make”,“make install”就能够把程序安装到Linux系统中去了。 编译第三方源代码时,能够看下工程中的readme和install文件,通常状况下都会写编译步骤。
 
 一、./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下运行的代码。
 
二、Makefile包含了一些基本的预先定义的操做:

>>make: 根据Makefile编译源代码,链接,生成目标文件,可执行文件;github

>>make clean: 清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件;sql

>>make distclean: 相似make clean,但同时也将configure生成的文件所有删除掉,包括Makefile;bash

>>make test / make check: 检查make,确保make没有出错,通常在make install以前执行;curl

>>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,来确认编译不出现错误,最后提示你软件包已经准备好,能够发布了;ui

 
3、交叉编译源代码
一、环境
Ubuntu
 
二、树莓派交叉编译工具安装

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

 

 

 

3、编译源代码

一、在写编译脚本时,必定要确保编译器写的是交叉编译的编译器。好比比较经常使用的Makefile,

1 demo: $(obj) 2     $(CXX) -o $@ $^ $(LDFLAGS)

其中的CXX必须是arm-linux-gnueabihf-g++才能编译出正确的在树莓派上的可执行文件。

二、编译第三方库

若是你想设置全局的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

相关文章
相关标签/搜索