说明
前段时间在做Qt在ARM上的移植工作,开发板是米尔科技的 z-turn 版,带有赛灵思(Xilinx)的 zynq-7000 系列的 SOC (FPGA+ARM),最开始试着在其上移植 Qt5,也联系了米尔科技的工程师,回复说没有移植过,几经周折,始终未遂,总是执行不报错但就是不弹出窗口,无奈,就搁置下来。
几个月后,项目需要,又开始重新考虑移植的问题。由于本人对FPGA不熟,就使用了米尔科技官方光盘中提供的启动文件及系统(ubuntu12.04),这样可以成功启动系统、使用HDMI显示器(由于其中的HDMI控制器是用FPGA实现的,而该IP核又是非免费的,只能试用30分钟) 、上网(DSL模块似乎有问题)。后来偶然发现该ubuntu系统中的编译器为 arm-linux-gnueabihf-
,注意 hf
,即支持硬浮点的编译器,与之前使用的光盘里的 arm-xilinx-linux-gnueabi-
支持的软浮点的编译器不同,好坑啊;又考虑到系统版本较低,故这次的环境如下:
- 宿主机:Ubuntu 14.04 LTS + Qt5
- 交叉编译器:
arm-linux-gnueabihf-
- ARM版Qt版本:Qt4.7.3
终于成功了!!!
先上张图
下面介绍移植步骤。
交叉编译Qt
Qt源码的编译安装与普通linux源码程序安装大同小异,只需三个步骤:配置、构建与安装:
configure make make install
安装配置交叉编译环境
arm-linux-gnueabihf
交叉编译器可以直接通过 apt-get
安装, 命令如下:
sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
配置Qt
指定交叉编译器
在运行 configure
命令之前,需要先修改 qmake.conf
文件中的交叉编译器,首先在 qt4.7-src-dir/mkspecs/qws/
下找到 linux-arm-gnueabi-g++
文件夹,复制并命名为 linux-arm-gnueabihf-g++
,打开该文件夹,修改 qmake.conf
文件:
#
# qmake configuration for building with arm-linux-gnueabihf-g++
#
include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.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)
配置
./configure -embedded armv9 -xplatform qws/linux-arm-gnueabihf-g++ -little-endian -opensource -host-little-endian -confirm-license -nomake demos -nomake examples -no-pch -no-openssl -no-opengl
构建与安装
配置完成后,执行:
make make install
如果电脑有多线程,可以使用多线程,来加快速度:
make -j4 make install
默认安装路径为:/usr/local/Trolltech
移植Qt库到ARM
移植到开发板
将上述安装目录通过 sudo cp -arf
拷贝到开发板SD卡,如:
sudo cp -rf /usr/local/Trolltech /media/liu/ROOFTS/usr/local
也可以不全部拷贝,但需要包含以下目录:
- lib
- plugins
设置环境变量
文件 .bashrc
:
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.3-generic
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QWS_DISPLAY="LinuxFB:/dev/fb1"
export QWS_USB_KEYBOARD="/dev/input/envent0"
export QWS_MOUSE_PROTO="MouseMan:/dev/input/mouse1"
export QT_QWS_FONTDIR=$QTDIR/lib/fonts/
export QT_PLUGIN_PATH=$QTDIR/plugins/