一、 Preparation
以下环境配置支持虚拟机和实体机,但是实体机生产效率会相对高一点,实体机编译Qt的速度是虚拟机两倍以上。
若使用虚拟机,推荐使用VirtualBox,开源免费,尽量不要使用Vmware破解版。
Download List
名称 |
链接 |
下载项目 |
OS |
https://mirror.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso |
|
Armhf toolchain |
https://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/arm-linux-gnueabihf/ |
gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf.tar.xz sysroot-linaro-eglibc-gcc4.9-2016.02-arm-linux-gnueabihf.tar.xz |
Qt5.8 |
http://download.qt.io/archive/qt/5.8/5.8.0/ |
二、 System Installation
OS:CentOS 7 x86_x64
[虚拟机:>= VirtualBox 5]
三、 System Configuration
以下除特殊说明,所有操作均使用root角色,请确保网络通畅(可以使用代理网络,这里不说明如何使用网络代理)。
1. ConfitureNetwork
ip addr #查看网络是否启用,及对应网卡名称,假设为enpos3
service network restart #重启网络
#开机自动启动网络
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 #将ONBOOT=no改为ONBOOT=yes
ip addr #查看网络是否已经可用
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看防火墙状态
#设置yum网络代理,针对虚拟机无法直接连接办公网络,若可以联网则无需设置
vi /etc/yum.conf #在最下面新增一行,填写代理ip和端口,示例:proxy=http://192.168.10.209:3128
2. Installthe epel Repository
yum makecache #更新镜像包列表
yum install epel-release -y #安装epel镜像包
使用技巧:
如果epel的源很慢,在使用yum安装一些常用软件时,新建/etc/yum.repos.d/backup,将epel.repo和epel-test.repo放到backup,就不会启用epel,然后安装就会很快,如果安装时发现找不到的软件,就将epel移动到原来位置再安装。
3. InstallXfce Desktop Environment
#清空镜像包列表
yum clean all
#更新epel镜像包列表
yum makecache
#安装X server
yum groupinstall "X Window system" -y
#安装xfce桌面
yum groupinstall Xfce -y
#默认启动图形界面
ln -sf /lib/systemd/system/graphical.taget/etc/systemd/system/default.target
reboot #重启查看是否完成桌面安装
#安装一些必备软件
yum install file-roller network-manager-applet cjkuni-ukai-fonts firefoxgcc gcc-c++ gdb nano gedit git svn ibus ibus-libpinyin ibus-gtk2/3 im-choosergtk2/3-immodule-xim perl -y
file-roller #thunar文件管理器右键修复
network-manager-applet #网络管理器,无需wifi则不用安装
cjkuni-ukai-fonts #楷体,支持中文
firefox #firefox浏览器,使用Firefox时注意是否需要代理网络
gcc gcc-c++ #gcc和g++
gdb #gdb调试工具
nano gedit #nano和gedit文本编辑器
git svn #版本控制软件
ibus ibus-libpinyin ibus-gtk2/3 im-choosergtk2/3-immodule-xim #中文输入法
perl #gmake Qt时要调用perl执行脚本
#配置输入法
im-chooser #此处两个命令使用普通用户执行,即Xfce登录账户,选择ibus,并配置默认输入法,注销重新登录
ibus-setup #设置快捷键,勾选Customizeactive input methods,增加Chinese-Intelligent-Pinyin
4. Installx64 & x86 Library
#安装C与C++相关Library
yum install libgcc libgcc.i686 libstdc++-devel libstdc++-devel.i686 glibc-staticglibc-static.i686 glibc-devel glibc-devel.i686 zlib zlib.i686 libstdc++ libstdc++.i686-y
yum update #此步骤可以省略,更新所有旧的软件
5. CopyQt5.8.0 and toolchain
将下载的Qt5.8.0_x64.run文件、Qt5.8.0源码文件、armhf-gcc以及sysroot复制到CentOS7中。
可以安装VirtualBox增强工具来实现虚拟机与主机之间的文件共享和剪贴板共享,或者使用ftp传输。
6. InstallQt5.8.0_x64
#增加可执行权限
chmod +x qt-opensouce-linux-x64-5.8.0.run
#安装qt5.8.0_x64二进制文件
./qt-opensouce-linux-x64-5.8.0.run
#创建链接,方便root用户调用(因为部分权限需要root用户来执行Qt调试)
ln -s /opt/Qt5.8.0/Tools/QtCreator/bin/qtcreator /usr/sbin
7. Compileand Install Qt5.8.0_x86
#解压qt5.8.0源码
tar -xzvf qt-everywhere-opensource-src-5.8.0.tar.gz -C qt-everywhere-opensource-src-5.8.0_x86
#进入qt5.8.0源码目录
cd qt-everywhere-opensource-src-5.8.0_x86
#配置qt5.8.0_x86编译条件
./configure -release -opensource -confirm-license -prefix/opt/Qt5.8.0_x86 -xplatform linux-g++-32 -nomake examples -nomake tests -no-opengl
#测试qtbase编译是否有问题
gmake -j4 module-qtbase #使用四线程编译
#没有问题则整体编译,并安装
gmake -j4 & gmake install
#删除源码活页夹,在Qt5.8.0_x64附带的QtCreator中添加Qt5.8.0_x86版本
8. Compileand install Qt5.8.0_armhf
#解压qt5.8.0源码
tar -xzvf qt-everywhere-opensource-src-5.8.0.tar.gz -C qt-everywhere-opensource-src-5.8.0_armhf
#解压armhf-gcc
xz -d gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf.tar.xz
tar -xvf gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf.tar -C /opt
# 解压sysroot
xz -d sysroot-linaro-eglibc-gcc4.9-2016.02-arm-linux-gnueabihf.tar.xz
tar -xvf sysroot-linaro-eglibc-gcc4.9-2016.02-arm-linux-gnueabihf.tar-C /opt
#进入源码目录
cd qt-everywhere-opensource-src-5.8.0_armhf
#修改platform的toolchain
gedit qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
################################################
# 以下为修改后的 qmake.conf 内容
#
# qmake configuration for buildingwith arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a
QMAKE_CXXFLAGS_RELEASE += -O2-march=armv7-a
# modifications to g++.conf
QMAKE_CC = /opt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX = /opt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
QMAKE_LINK = /opt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = /opt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
# modifications to linux.conf
QMAKE_AR = /opt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-arcqs
QMAKE_OBJCOPY =/opt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM = /opt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-nm-P
QMAKE_STRIP = /opt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-strip
load(qt_config)
# qmake.conf end
##############################################
#配置,跳过两个模块,这两个模块目前编译有问题,另外使用由于gcc限制,只使用c++11特性
./configure -release -opensource -confirm-license -prefix/opt/Qt-5.8.0_armhf -xplatform linux-arm-gnueabi-g++ -no-opengl -c++std c++11-no-dbus -nomake examples -nomake tests -skip qtdeclarative -skip qtpurchasing
#仅编译核心部分测试是否有问题
sudo make -j4 module-qtbase
#编译整体并安装
sudo make -j4 & make install
#删除源码活页夹,在Qt5.8.0_x64附带的QtCreator中添加Qt5.8.0_armhf版本,sysroot以及armhf-gcc、armhf-g++、armhf-gdb
#程序移植
程序移植到armhf开发板上需要用到两方面的Library,一个是arm-gcc的Library,另一个是Qt-Library。
移植方式为:
1、 拷贝/opt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf和Qt需要的Library (libstdc++.so.6, libQt5Network.so.6,libQt5Core.so.6等)到开发板/opt/lib中
2、 在开发板输入命令:export LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH,增加搜索的Library路径(仅本次有效,防止出错,可以重启失效)
3、 在开发板测试程序是否正常运行
4、 确认程序运行正常后,在开发板将搜索库命令写入/etc/profile中或者~/.bashrc开机启动。
Cubietruck官方测试通过的镜像为:debian-jessie-server-ct-card0-hdmi&&vga-V1.0.img.7z
如果cubietruck的OS不是使用自行编译出来的,可能存在glibc版本过低的问题。
若出现/lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.17' not found,则表示开发板的glibc版本过低,而交叉编译程序使用的glibc版本较高,Copy arm-gcc 中对应的libc.so.6到开发板的/opt/lib中,再次运行。
若出现error while loading shared libraries: /opt/lib/libc.so.6: unexpectedreloc type 0xa0,则说明arm-gcc中的libc不可用,强制重启,删除/opt/lib/libc.so.6,此系统无法使用,建议更换新版本系统或者自行编译出OS烧录到开发板中。