一、交叉编译

在一个平台上生成另一个平台上的可执行代码。为什么要大费周折的进行交叉编译呢?一句话:不得已而为之。有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行所需要的编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。

要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(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

Ubuntu实现树莓派交叉编译相关推荐

  1. 树莓派交叉编译(PS交叉编译链下载安装、配置永久环境变量、带WiringPi库交叉编译、软链接)

    目录 一.本章概述 二.交叉编译工具链的下载安装 下载 安装 交叉编译链临时有效 交叉编译链永久有效 三.交叉编译的使用 对比gcc与armgcc PC端交叉编译发送到树莓派运行 四.带WiringP ...

  2. 树莓派交叉编译 内核编译 - HQ

    树莓派交叉编译 & 内核编译 - HQ 文章目录 树莓派交叉编译 & 内核编译 - HQ @[toc] 注意 树莓派交叉编译 引入 交叉编译工具链的安装 交叉编译使用举例 树莓派源码分 ...

  3. 在Linux下使用树莓派交叉编译工具编译opencv库并进行移植

    一.交叉编译opencv 继上一篇博客:"在Linux下配置opencv"之后,我以为直接将编译命令:g++ `pkg-config --cflags opencv` -o Tes ...

  4. Ubuntu 安装arm-linux-gcc交叉编译工具

    最近要开发嵌入式linux,但是手头上大多文档中介绍交叉编译环境的都是基于RedHat9的,这个版本虽说很经典,但是毕竟实在是太古老了,自己机器上本身装的是Ubuntu,因此小小的研究了一下,在ubu ...

  5. PC(Ubuntu)和树莓派实现无秘ssh

    PC(Ubuntu)和树莓派实现网线无秘ssh 为了调试的方便,我在主机(Ubuntu)和树莓派实现ssh登录无需每次输入密码和无需每次输入IP ssh配置文件 在ssh的配置文件里修改,实现快捷登录 ...

  6. ubuntu 14.04 交叉编译ffmpeg

    因为工作的关系和自己的兴趣原因,我尝试了自己从ubuntu 14.04 交叉编译ffmpeg. 我交叉编译ffmpeg的方法,完全是摸索得到的.在这之前,我从来没有试过交叉编译. 在从ubuntu成功 ...

  7. Ubuntu 环境下交叉编译运行正点原子的程序

    Ubuntu 环境下交叉编译运行正点原子的程序 在校学生,求职过程中对方要求在Ubuntu环境下交叉编译stm32的程序,我觉得很有意思,因为之前就听说过可以在Linux环境下运行stm32的程序,因 ...

  8. 树莓派交叉编译opencv3.4.1/pycharm安装opencv/实现人脸识别Demo记录

    目录 文章目录 目录 前言 树莓派交叉编译opencv3.4.1 安装环境 开始交叉编译 错误记录 WIN10+Anaconda+PyCharm安装opencv3.4.7 WIN10下opencv人脸 ...

  9. 树莓派 交叉编译工具链的安装

    1.交叉编译是什么: 2.为什么要交叉编译? 3.交叉编译需要用到什么工具? 4..交叉编译工具链的安装 4.1临时有效 4.2永久有效 安装流程: 1.用file Zilla将tools-maste ...

最新文章

  1. 有没有将深度学习融入机器人领域的尝试?有哪些难点?
  2. 龙邱树莓派Raspberry Pi 扩展板电路及其相关实验
  3. (数论)51NOD 1135 原根
  4. c语言变量作用域生命周期,C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期...
  5. 聊聊 HTTP 常见的请求方式
  6. jzoj3318-[BOI2013]Brunhilda的生日【数论】
  7. vaadin_5分钟内Google App Engine上的Vaadin App
  8. MATLAB提取矩阵中的一部分
  9. length函数的头文件_Framebuffer 应用编程中涉及的 API 函数
  10. 在命令行上启用 64 位 Visual C++ 工具集
  11. 查询长期未登录AD的用户
  12. 【elasticsearch】elasticsearch 7 index.lifecycle.rollover_alias does not point to index
  13. (转)正则表达式在ORACLE中的使用
  14. 伽玛校正(Gamma Correction)
  15. ArcGIS中令栅格数据研究区中水体的DN值为零
  16. You are what you read 笔记
  17. 不外昨夜下战书当店的裘姓值班司理则称
  18. go 错误处理与测试
  19. SQLite 对时间的支持
  20. android优化最强软件,七款安卓手机优化软件推荐 为手机提速

热门文章

  1. uvm 形式验证_uvm面试题
  2. python size和count_python中size和count的区别
  3. Apache Tika:通用的内容分析工具
  4. mapreduce简单的gzip压缩
  5. 玩转GIT系列之【git submodule update出错提示子模组未对路径注册】
  6. 玩转mini2440开发板之【编译u-boot提示没有规则可以创建“XX.o”需要的目标】
  7. [机器学习] 分类 --- Support Vector Machine (SVM)
  8. 机器学习 可视化_机器学习-可视化
  9. libusb:libusb_bulk_transfer的timeout参数问题
  10. python调用C语言函数(方法)的几种方法