Centos 7/qt 之搭建arm交叉编译环境

2019-07-13 07:52发布

前言

搞嵌入式难免和arm开发板打交道,普通源文件可以通过PC上配置交叉编译器编译成ARM架构的可执行文件直接下载到开发板上运行,这是一般的操作。倘若要用到QT的工程文件来编译,这时候pc上的QT版本就不支持了,因为pc版是x86_64架构,两者不能兼容。而如果开发板不支持本地安装qt,我们就要自己编译一个嵌入式linux且支持arm架构的qt版本,以满足我们在开发板上跑qt程序的需要.

本文使用的开发板是树莓派(raspberrypi)3代B型,核心是arm公司的Cortex-A53,方法在其他arm开发板适用。

1、准备工作

保证电脑有安装qt,如若没有,可以下载这里的安装包安装(64位),下载地址:
链接: https://pan.baidu.com/s/1nvl6oeH 密码: g7uj 下载之后,在终端用命令给其执行权限,注意切换到管理员用户(root): #chmod 0755 qt-opensource-linux-x64-5.9.1.run 然后鼠标双击运行即可,之后就按照提示安装完成。

2、配置交叉编译器

注意,建议事先了解开发板系统所自带的交叉编译器,防止版本不适配带来的问题。配置的交叉编译器和编译QT的编译器最好一致,否则可能出错。比如,本项目采用的是树莓派自带的arm-linux-gnueabihf-gcc/g++的编译器,那么整个过程的编译都是用此编译器,这样保证编译的文件环境属性和开发板的运行环境一致,出错可能性较小。

这里有几个版本可供下载,是否支持取决于板上的系统
arm-linux-gcc :实际上是arm-linux-gnueabi-gcc ,大多数linux系统版本支持
arm-linux-gnueabihf-gcc: 树莓派自带编译器,本项目使用
aarch64-linux-gnu-gcc : 针对Arch linux 系统版本 下载地址:
链接: https://pan.baidu.com/s/1i5KQVkD 密码: wwia 解压 #tar -zvxf gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux.tar.gz 后得到目录gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux 在root用户下配置环境变量,编辑.bashrc文件 #vim /root/.bashrc 在里面添加一行 export PATH=/解压的路径/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin:$PATH 然后按esc,输入:wq保存退出,重新打开终端生效。
输入arm-,然后按几下tab,如果有出现一堆编译器就表示配置成功
这里写图片描述

3、编译嵌入式linux的QT版本

这次用到的版本是qt-everywhere-opensource,一个适用于嵌入式linux的版本,而这个版本没有二进制版本,只能靠我们自己编译。 源码下载地址:
链接: https://pan.baidu.com/s/1pLFUt9T 密码: 9avn 解压 #tar -zxvf qt-everywhere-opensource-src-4.8.6.tar.gz 进入qt-everywhere-opensource-src-4.8.6目录,更改mkspecs目录下linux-arm-gnueabi-g++目录名为linux-arm-gnueabihf-g++ #cd qt-everywhere-opensource-src-4.8.6/ #mv mkspecs/linux-arm-gnueabi-g++ mkspecs/linux-arm-gnueabihf-g++ 编辑qmake.config文件 #vim mkspecs/linux-arm-gnueabihf-g++/qmake.conf 修改原来的交叉编译器换成本项目使用的编译器,结果如下: # # qmake configuration for building with arm-linux-gnueabi-g++ # MAKEFILE_GENERATOR = UNIX TARGET_PLATFORM = unix TEMPLATE = app CONFIG += qt warn_on release incremental link_prl gdb_dwarf _index QT += core gui QMAKE_INCREMENTAL_STYLE = sublib include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) # modifications to g++.conf QMAKE_CC = arm-linux-gnueabihf-gcc QMAKE_CXX = arm-linux-gnueabihf-g++ QMAKE_LINK = arm-linux-gnueabihf-g++ QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++ # modifications to linux.conf QMAKE_AR = arm-linux-gnueabihf-ar cqs QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy QMAKE_STRIP = arm-linux-gnueabihf-strip load(qt_config) 然后保存退出。
编译前安装所需要的32位库: #yum install glibc.i686 libstdc++.i686 zlib.i686 #yum install mesa*.i686 完成后,在终端执行如下命令,进行编译前的环境配置和检查: ./configure -prefix /opt/Qt-4.8.6 -embedded arm -xplatform linux-arm-gnueabihf-g++ -depths 16,24,32 -little-endian -no-mmx -no-3dnow -no-sse -no-sse2 -no-glib -no-cups -no-largefile -no-accessibility -no-openssl -no-gtkstyle -qt-freetype -qt-mouse-pc -qt-mouse-linuxtp -qt-mouse-linuxinput -plugin-mouse-pc -fast -qt-gfx-transformed -opensource -confirm-license 其中,-prefix 后面是指定编译后的安装目录/opt/Qt-4.8.6,-xplatform 后指定交叉编译器linux-arm-gnueabihf-g++,其余选项可以不变 检查完成后,会提示 you just to run “gmake”…等等英文
接下来开始编译安装 #gmake //开始编译 过程大概几个小时,耐心等待…
编译完成后,安装: #gmake install //开始安装 安装完成后,在/opt下就可以看到Qt-4.8.6目录,编译安装成功。

4、配置QT

1)配置交叉编译器

打开PC版本的QT,菜单栏 工具 -> 选项, 选择 “构建和运行”,
接下来配置刚才编译的交叉编译器,gcc和g++的交叉编译版本 点击 “编译器”,选择“Manual”,在右边点击“添加”按钮,选择GCC->C,
名称可命名为ARMGCC,点击浏览,找到编译器目录下的bin目录,选择
arm-linux-gnueabihf-gcc,点击open,然后点击Apply
这里写图片描述 同理,在右边点击“添加”按钮,选择GCC->C++,
名称可命名为ARMG++,点击浏览,找到编译器目录下的bin目录,选择
arm-linux-gnueabihf-g++,点击open,然后点击Apply
这里写图片描述
配置结果如图:
这里写图片描述
点击OK

2)配置qt嵌入式linux版本

回到“构建和运行”,选择Qt Versions,选择手动设置,右边点击“添加”,找到/opt/Qt-4.8.6/bin/qmake,也就是安装后qmake的目录,点击open
这里写图片描述 点击Apply,效果如图:
这里写图片描述 点击 OK 。

3)增加套件

回到 构建和运行,点击“构建套件”,选择手动设置,右边点击添加,
配置如图:
这里写图片描述
备注:sysroot 可以不用添加
点击Apply,然后点击OK,这样qt的环境就配置好了 现在可以试试新建一个工程文件,编译一个hellowindow,套件要选择arm!亲测是可以通过的
这里写图片描述

4)复制相关的QT库

将 /opt/Qt-4.8.6/lib/ 下的所有动态链接库文件复制到板上的 /usr/lib/ 下
这样确保库文件不会找不到 最后,将编译后的可执行文件拷到板上,在板上执行,要加-qws参数 #./可执行文件名 -qws 成功运行,大功告成! 这里写图片描述