嵌入式开发
Ubuntu16.04 ARM/Qt 交叉编译环境搭建
最近由于工作需要,接触到交叉编译,鉴于之前没有完整做过这方面的工作,记录一下。后续也会尽量把相关的内容都加入进来
背景
客户需求要在嵌入式环境中使用相机,这个相机之前有完整的windows版本SDK,嵌入式下面还没开发过,因此需要移植,目前考虑的主要问题就是环境搭建吧,代码理论上应该不需要改动或者改动比较小。客户用的开发板是toybrick-3399Pro,目前手上只有Firefly-RK3288,两个架构有所不同,前者是六核ARM 64位处理器(双核Cortex-A72+四核Cortex-A53),ARMv8指令集,后者是四核ARM 32位处理器(四核Cortex-A17),ARMv7-A指令集,对于交叉编译来说,就是32位和64位的区别。为了验证整个移植过程,先在Firefly-RK3288上跑通Qt Demo,然后再更换交叉编译工具,编好后给客户测试。
(32位和64位会放在一起说明,不同的平台基本步骤是一样,如果是自己用,针对自己的平台处理一种就行了,没必要32位和64位都下载)
环境说明
服务器:虚拟机+ubuntu16.04 64位
安装交叉编译工具
所有操作都在root权限下进行。
交叉编译安装方法有两种:可以直接apt-get安装,也可以自己下载源文件
1、apt-get安装
$sudo apt-get install gcc-arm-linux-gnueabihf
$sudo apt-get install g++-arm-linux-gnueabihf
这种安装方式,不需要手动添加环境变量,安装完成后,交叉编译工具会放在/usr/bin目录下
2、手动安装
如果无法用apt-get安装,提示:Unable to locate package gcc-arm-linux-gnueabihf,可以单独下载交叉编译器。
下载地址:https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/
这里面有很多版本,区别无外乎几个:大小端,Armv7/Armv8,32位/64位,裸机/Linux,具体如下表:
名称 | syscall | 指令集 | 大小端 | 位宽 | description |
---|---|---|---|---|---|
aarch64-linux-gnu | linux | ARMv8 | little | 64 | aarch64 Linux Platform |
aarch64_be-linux-gnu | linux | ARMv8 | big | 64 | aarch64 Linux Platform |
arm-linux-gnu-gnueabi | linux | ARMv7 | little | 32 | arm EABI soft-float |
arm-linux-gnu-gnueabihf | linux | ARMv7 | little | 32 | arm EABI hard-float |
armeb-linux-gnu-gnueabi | linux | ARMv7 | big | 32 | arm EABI soft-float |
armeb-linux-gnu-gnueabihf | linux | ARMv7 | big | 32 | arm EABI hard-float |
arm-eabi | BareMetal | ARMv7 | little | 32 | arm EABI hard-float |
armeb-eabi | BareMetal | ARMv7 | big | 32 | arm EABI soft-float |
aarch64-elf | BareMetal | ARMv8 | little | 64 | armv8 EABI,hard-float |
对于32位arm平台下载
gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xz.
因为后面还有64位平台需要处理,所以还下载了64位的交叉编译工具
gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz.
下载完成后,手动安装:
$tar -xvf gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xz
$mv gcc-linaro-7.3.1-2018.05-x86_64_arm-linux