Ubuntu16.04 32 bit 交叉编译Arm Linux平台的QT5
1、准备交叉编译环境
源环境平台:ubuntu16.04 32位
目标坏境平台:树莓派,Jetson TK1,tinker board, 等arm平台
配置流程:
1,Qt库开源代码,Qt软件,我使用的是5.5.1版本;
2, 安装交叉编译器arm-linux-gnueabihf(gcc、g++4.9以上版本,支持c++11)。
3, 配置Qtcreator 编译器arm-linux-gnueabihf
4,安装目标平台 runtime arm-linux-gnueabihf
5,GCC ,G++编译器在4.8以上,不然会有很奇怪的报错。
1.1、下载Qt软件和源码库
目前Qt x86架构的软件只提供到5.5.1,如果要使用最新的版本,那就需要自己编译了,哈哈,这里就不在叙述。按装QT,大体有三种方式:(推荐1,2种方式简单bug少)
1,offline 去网址下载 https://download.qt.io/archive/qt/5.5/5.5.1/
2,online 去网址下载 http://download.qt.io/official_releases/online_installers/
3,命令方式安装(注意:不一定是最新的Qt版本)
3.1 更新软件源 $ sudo apt-get update
3.2 替换旧的软件包 $ sudo apt-get upgrade
3.3 安装 qt5-default 库 $ sudo apt-get install qt5-default –y
3.4 安装 qtcreator $ sudo apt-get install qtcreator –y
4,下载源码库 https://download.qt.io/archive/qt/5.5/5.5.1/single/
1.2、安装交叉编译器
目前市面上有好多交叉编译器,我现在使用linaro公司的交叉编译器,arm-linux-gnueabihf工具编译后的程序不需要联带依赖库一起打包,(这个我喜欢)
下载网址
http://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/arm-linux-gnueabihf/
下载最新版1,下载完成后,解压在 /usr/local/arm_linux/目录下,方便后续步骤…
将其bin目录添加到环境变量PATH中。
2,PATH环境变量方式有很多,我使用的是添加如下图
$ sudo cd /home
$ sudo gedit .bashrc 或者使用vim
$ sudo source .bashrc
3, 坏境变量添加好了,可以测试一下,打开终端
$ arm-linux-gnueabihf-g++ -v //显示如下就说明配置好了
2 交叉编译Qt库(我这里使用的是Qt-everywhere-opensource-src-5.5.1.tar.gz)
1, 解压Qt源码库
$ cd /home/Qt //没有Qt目前自己新建
$ Sudo tar xpf qt-everywhere-opensource-src-5.5.1.tar.gz
2,编译QT源码程序之前,首先要对/qt-everywhere-opensource-src-5.5.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 做修改。
$ cd /qt-everywhere-opensource-src-5.5.1/qtbase/mkspecs/linux-arm-gnueabi-g++/
$ sudo gedit qmake.conf
修改前:
修改后:
3,编译QT源码程序
./configure -release -opengl es2 -device linux-rasp-pi2-g++ -device-option CROSS_COMPILE=$TOOLCHAIN/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- -sysroot $ROOTFS -prefix /usr/local/qt5
指令详解:
./configure
-release 直接编译发布版
-opensource 开源版
-device linux-rasp-pi2-g++ 运行设备名称(具体可以到qt-everywhere-opensource-src-5.7.1/qtbase/mkspecs/devices/目录查看支持的设备)
-device-option CROSS_COMPILE=arm-linux-gnueabihf- 交叉编译器选择的类型arm-linux-gnueabihf-
-prefix /opt/Qt5.5.1/armv7-a 编译好的程序安装路径
-sysroot /mnt/bananapro 编译的头文件和选择,需要挂载源img包,(这个部分折腾了一段时间,没有搞定,爱折腾的朋友可以去试一下)
-hostprefix /opt/Qt5.6.0/host运行设备安装位置
-opengl es2 一般不需要
-libinput Synopsis 一般不需要
我使用的方式:
1), sudo ./configure -prefix /opt/qt5.5.1-arm-linux -opensource -nomake tests -nomake examples -xplatform linux-arm-gnueabi-g++
2), sudo make (也可以make –j4, 个人不推荐使用,莫名其妙问题)。
(adjust the `-jN' parameter as appropriate for your system)
cc1plus: all warnings being treated as errors
Makefile:44193: recipe for target '.obj/qmimedata.o' failed
make[3]: *** [.obj/qmimedata.o] Error 1
make[3]: *** 正在等待未完成的任务....
make[3]: Leaving directory '/root/qt-everywhere-opensource-src-5.7.1/qtbase/src/corelib'
Makefile:194: recipe for target 'sub-corelib-make_first' failed
make[2]: *** [sub-corelib-make_first] Error 2
make[2]: Leaving directory '/root/qt-everywhere-opensource-src-5.7.1/qtbase/src'
Makefile:46: recipe for target 'sub-src-make_first' failed
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory '/root/qt-everywhere-opensource-src-5.7.1/qtbase'
Makefile:77: recipe for target 'module-qtbase-make_first' failed
make: *** [module-qtbase-make_first] Error 2
3),sudo make install
4,检查QT安装的状态
1),打开终端
Cd /opt/qt5.7.1-arm
正常有如下文件:
3 配置Qtcreator 编译器arm-linux-gnueabihf
1), 安装qt-opensource-linux-x86-5.5.1.run
2), 安装完成后,接下来配置:
~工具->选项
~构建和运行
~Qt versions 手动添加一个qmake (添加自己前面交叉编译好的Qt程序,/opt/qt5.5.1-arm-linux/bin)
~添加好了qmake 项,我这里两个版本,都有编译。
~编译器-> 手动添加GCC
~debuggers-> 手动添加gdb
~构建套件(Kit)(sysroot看自己吧,有的同学用到这个了,我目前没有用到)
~好了,到这里我们算是完成了第一步
4 安装目标平台
添加设备项:
创建一个项目吧
测试一下效果:
来看看设备效果吧,
运行ok
注意事项: 这种流程只适合调用Qt内部的库,没有问题,如果调用内核底层库的时候,比如动态库的时候,就会出现类似没有找到XCB 的故障问题,不能运行。
1,The test for linking against libxcb failed!
Use of pkg-config is not enabled, maybe you want to pass -pkg-config?
You might need to install dependency packages for libxcb.
2, See src/plugins/platforms/xcb/README.,,
/home/ubuntu//untitled3: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /home/ubuntu//untitled3)
Application finished with exit code 1.
以上问题我已经解决,后续………..
中上所述,我走过了很多坑,不希望朋友们再入坑,先写到这里,有什么不足之处,请体谅,谢谢