树莓派学习::qt5交叉编译(armv864位)
Ubuntu16.04 x64环境下进⾏qt5交叉编译(armv8)
写在最前:本⽂的前半部分主要为⼀步步记录个⼈在ubuntu16.04下编译qt5.6.0的过程,⽽⽂章后部分为qt其他版本的编译情况以及⼀些编译技巧,建议在动⼿前先阅读全⽂,可以让你少⾛⼀点弯路。
gnu编译器
⽬前可⽐较完美编译的版本有:qt5.6.0、qt5.9.7
背景
交叉编译的作⽤
由于arm板⼦的性能有限,在性能强⼤的笔记本或者台式电脑上进⾏程序的调试和编译是很舒服的事情。当然,如果对速度没有追求,⼤可以在开发板上直接apt-get install qtcreator , qt4等来配置环境,直接在开发板上进⾏编程。
测试环境
(1)硬件设备
msi笔记本,I7-4710H,16G内存
树莓派3b+,armv8(64位),16Gsd卡
(2)系统环境
笔记本:ubuntu16.04 x64位
树莓派3b+:debian9 x64位
建议 :如果要交叉编译 32位的程序,笔记本系统最好⽤32位,相反,如果要交叉编译出64位程序,笔记本系统 ⽤64位,这样可以免去很多奇怪的报错
(3)你的疑惑:
问:树莓派官⽅并没有出64位的系统,为什么我的树莓派安装的是64位系统
答:个⼈需求,具体安装会在下⽂
环境配置及编译过程
⼀、树莓派环境安装
系统来源:OPENFANS开源社区-量⼦云&&树莓派爱好者基地。
(2) 系统烧写
像官⽅系统⼀样烧写即可
(3)系统配置
1)创建⽂件sudo nano /etc/network/interfaces.d/wlan0
由于给出的系统是纯净系统,没有ui界⾯,因此为了可以连上ssh,尽量在有⽹络的条件下进⾏
开机即可使⽤ssh,关于有线⽹络IP请⾃⾏在路由器上检查。账户名:pi 密码:raspberry
下⾯给出wifi设置教程,个⼈估计可以在sd卡上直接写⼊,那么就可以直接连wifi,当然也可以在ssh下设置
2)编辑⽂件,写⼊以下内容:
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid “你的⽆线SSID名称”
wpa-psk “你的⽆线SSID对应的密码”
3)保存退出
4)重启或输⼊sudo service networking restart即可正常使⽤
(4)安装桌⾯
#教程推荐使⽤mate桌⾯环境,个⼈也是⽤这个,希望有⼩伙伴尝试⼀下gnome,再来分享
sudo apt-get update
sudo apt-get install xserver-xorg -y
sudo apt-get install mate-desktop-environment-core lightdm -y
#如果想装LXDE桌⾯,直接执⾏这个
sudo apt-get install lxde
重启之后即可看到久违的桌⾯
⼆、笔记本ubuntu系统安装(不展开)
请确保你的系统⽐较⼲净
系统要进⾏update和upgrade
三 、 配置笔记本下的交叉编译环境
(1)问答:
问:什么交叉编译环境?
答:就是配置⼀个对应平台的g++编译器,⽐如说上⾯安装的树莓派3b+ 的64位系统,那么就要配置⼀个aarch64或arm64的g++编译器。
问:如何查看系统架构平台?
答:输⼊uname -a,如果有x86_64的就是64位,还可能出现arm64 aarch64等字样。其他⾃⾏查资料
问:如何配置这个g++编译器?
答:看下⽂
(2)对应平台的g++编译器配置,即配置交叉编译器
1)检查系统架构平台:uname -a
2)下载交叉编译器aarch64-linux-gnu-gcc
这⾥有旧版的和新版的可选,⽹上⼀⽚教程都⽤的旧版,个⼈⽤的是新版
3) 配置这个交叉编译器
新建⼀个⽂件夹arm,解压:
4)将路径写⼊PATH路径中,即打开⽂件:
sudo vim /etc/profile
5)在添加刚刚解压的⽂件夹的bin路径到PATH,即添加如下内容(具体路径⾃⾏根据环境修改):
export PATH=$PATH:/home/⽤户名/arm/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/
6)刷新:
source /etc/profile
7)检查配置是否完成(注意,两个都需要有正常输出,这⼀步才算完成):
aarch64-linux-gnu-g++ -v
sudo aarch64-linux-gnu-g++ -v
正常来说应该有如下输出:
特殊情况有:
输⼊sudo aarch64-linux-gnu-g++ -v,提⽰没有到命令,⽽直接输⼊aarch64-linux-gnu-g++ -v可正常显⽰
解决⽅案:在sudos配置⽂件下把交叉编译器的bin路径也加⼊
sudo vi /etc/sudoers
加⼊之后应该是这个样⼦:
这时再次输⼊sudo aarch64-linux-gnu-g++ -v,就应该可以正常输出版本信息了。
问:为什么⼀定要sudo aarch64-linux-gnu-g++ -v 也有正常输出?
答:因为在下⾯的编译过程中make中没有⽤到sudo,但是安装的时候要sudo make install,这⼀步的操作也需要交叉编译器,如果不正确配置,会出现make成功,⽽sudo make install失败的奇观。
(3)到这⾥,这个交叉编译环境就基本OK了
四、下载qt源码以及安装包
(1)问答:
问:为什么需要源码和安装包两个东西?
答:安装包是⽤来给本地装⼀个qt,源码是⽤来编译⼀个 对应平台的qt,即编译⼀个arm平台可⽤的qt
问:QT版本有要求吗?
答:这个qt版本的话就有点讲究了,个⼈在QT5.5的源码交叉编译中出现莫名其妙的错误,QT5.7的话版本有点新,没有尝试,最终利⽤QT5.6.0版本成功编译,所以推荐QT5.6.0 个⼈对5.5.0、5.6.0、5.7.0、5.9.0、5.9.7这⼏个版本都尝试进⾏过交叉编译,其中(更详细的信息请参见⽂章最后):
1)qt5.5.0和qt5.9.7有 -qreal float编译的bug,即在make的过程中会出现如下错误:
error: no matching function for call to ‘qBound(double, const float&, double)’
据官⽅说,这个bug在qt5.5.1得到修复
2)qt5.6.0的的编译错误就更多了,本博客是基于qt5.6.0的交叉编译展开的,个⼈体会就是:当你把qt5.6.0成功编译之后,你会对qt的交叉编译有⼀定了解。
3)qt5.7.0的编译貌似也有bug,当时没记录,直接放弃,上qt5.9.0
4)qt5.9.0的bug有点奇怪,百度、GOOGLe基本不到相关资料,实在没办法,上5.9.7
5)qt5.9.7的bug跟qt5.5.0的⼀样,都是关于 -qreal float这个选项的,因此,只要把这个选项在 ./configure的时候去掉,就可以⼀次性成功编译,qt5.9.7是个⼈编译起来最舒服的⼀个版本了,虽然时间有点长。关于qt5.9.7的交叉编译configure会追加到本博客最后。[提⽰:如果你对qt交叉编译已经
有⼀定了解了,请直接编译qt5.9.7或者看看⽂章最后的交叉编译技巧(2019-1-22更新),下⾯的内容是个⼈编译5.6.0的⼀些坑的记录以及对应解决办法]
(2) 下载
(3)利⽤安装包在本地安装
这个⽐较简单,⼀路next基本没问题
(4)依赖库安装:
sudo apt-get install qt5*-dev
sudo apt-get install qtbase5-dev
sudo apt-get install qtdeclarative5-dev qml-module-qtquick-controls
五、qt源码配置
(1)问答:
问:这个qt源码怎么⽤?
答:我们的⽬的是利⽤源码编译出⼀个arm平台的qt,所以需要先配置,然后编译
(2)编译平台信息配置
1)解压下载的源码包,路径没要求,⼀般在“/home/⽤户” 下就可以
2)进解压的⽂件夹浏览⼀番
3)到qtbase,这个是编译出来的⽂件存放地⽅
cd qtbase
4)在qtbase中到mkspecs⽂件夹 ,这个⽂件夹放置着各种平台下的编译配置信息,
cd mkspecs
5)在mkspecs⽂件夹中到 linux-arm-gnueabi-g++⽂件夹,这个看起来就跟我们的平台很像,进⼊浏览
cd linux-arm-gnueabi-g++
6)在 linux-arm-gnueabi-g++⽂件夹下,可以看到两个⽂件,其中f是我们需要修改的⽂件
7)f原内容:
qmake configuration for building with arm-linux-gnueabi-g++
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(…/f)
include(…/f)
include(…/common/g+±f)
modifications to g++.conf
QMAKE_CC = arm-linux-gnueabi-gcc
QMAKE_CXX = arm-linux-gnueabi-g++
QMAKE_LINK = arm-linux-gnueabi-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++
modifications f
QMAKE_AR = arm-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy
QMAKE_NM = arm-linux-gnueabi-nm -P
QMAKE_STRIP = arm-linux-gnueabi-strip
load(qt_config)
8)修改:我们需要将原内容的arm-linux-gnueabi交叉编译器换成我们的,所以直接将上⾯的arm-linux-gnueabi换成aarch64-linux-gnu即可,当然,如果你下载的是其他交叉编译器,换成你对应的平台交叉编译器即可。如果不知道如何修改,可在终端上输⼊aarch64-linux-gnu-gcc -v,来看信息,然后⽤Target:后⾯的内容替换上⾯原内容中的arm-linux-gnueabi即可。
9)修改后的f⽂件内容如下:
qmake configuration for building with arm-linux-gnueabi-g++
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(…/f)
include(…/f)
include(…/common/g+±f)
modifications to g++.conf
QMAKE_CC = aarch64-linux-gnu-gcc
QMAKE_CXX = aarch64-linux-gnu-g++
QMAKE_LINK = aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++
modifications f
QMAKE_AR = aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy
QMAKE_NM = aarch64-linux-gnu-nm -P
QMAKE_STRIP = aarch64-linux-gnu-strip
load(qt_config)
10)到这⾥,配置的第⼀步完成了
(3)编译选项配置
1)这个就有点⽞妙了 ,建议先阅读⽂章:[编译] QT编译./configure参数的详细解释[新⼿充电必读]
2)总的来说,就是通过./configure 后⾯加上我们的⽬标平台信息、要编译的库、不编译的库等⼀些列选项,来编译出⼀个我们需要的arm⽬标平台版本的qt
3)⼀些关键选项:
-prefix 后⾯填⼊编译安装后arm平台版本的qt路径(后⾯需要将这个qt复制到开发板)
-xplatform linux-arm-gnueabi-g++ 这⾥就是选择我们刚刚修改完的⽬标平台信息,编译将会以这个⽬标平台为编译的⽬标
-no-pch、-no-iconv这⼏个no表⽰不编译这⼏个库,因为编译他们可能会导致奇怪的错误
-no-opengl表⽰不编译opengl,因为这个选项要求本机(笔记本)和开发板都具备opengl库才可以
-skip qtdeclarative 表⽰不编译qml、quick库,因为这两个库需要opengl库⽀持,为了以最简的⽅式成功编译qt,这⾥选择不编译qml、quick库,这个问题的描述相关参考:
1、blog.csdn/hhhlizhao/article/details/73604445、
2、/forum.php?mod=viewthread&tid=5563&extra=&ordertype=1、
3、/threads/55438-Project-ERROR-Unknow-module(s)-in-QT-quick、
4、bugreports.qt.io/browse/QTBUG-32740
4)这⾥直接给出⼀个.sh⽂件,⾥⾯直接写好了⼀些选项,⼀般不建议新⼿进⾏修改

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。