天嵌开发版 imx6 移植qt

1.环境说明
QT 移植
- 系统: ubuntu 14.04 x64
- 编译器: arm-none-linux-gnueabi-gcc 4.8.3
- QT 5.5.1
2.下载源码
- 下载交叉编译器,网址为: http://www.veryarm.com/arm-none-linux-gnueabi-gcc ,下载最新的
版本 4.8.2
- 下载 QT 源码,在 QT 官网上下载: https://download.qt.io/archive/qt/
3.移植 QT
3.1 配置交叉编译器
将下载的交叉编译器解压到任意文件夹( root 用户请放在出 /home 文件夹意外的位置),然后重命
名为 arm-gcc ,我解压后的完整路径是 /opt/EmbedRigol/arm-gcc 。
添加交叉编译器的环境变量: export PATH=$PATH:/opt/EmbedRigol/arm-gcc/bin 。
查看交叉编译器的配置是否成功,输入
arm-none-linux-gnueabi-gcc -v

如下图说明交叉编译器的版本是 4.8.3 ,配置成功。


3.2 修改编译 qt
( 1 )解压下载的源码
解压 qt 源文件到 /opt/EmbedRigol/ 下,解压后完整路径是 /opt/EmbedRigol/qt-everywhere-
opensource-src-5.5.1 。
注意,此处的解压要使用命令行形式(即终端的 tar 命令),不要直接右键提取到此处,否则会出现
意想不到的错误。
( 2 )修改 qmake 文件指定交叉编译器
在 qt 根目下进入 qtbase/mkspecs/linux-arm-gnueabi-g++/ 目录,并打开 qmake.conf 文件,如下:
cd qtbase/mkspecs/linux-arm-gnueabi-g++/
gedit qmake.conf
修改文件如下:
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR
= UNIX
CONFIG
+= incremental
QMAKE_INCREMENTAL_STYLE = sublib
QT_QPA_DEFAULT_PLATFORM = linux #eglfs
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-aQMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC
= arm-none-linux-gnueabi-gcc
QMAKE_CXX
= arm-none-linux-gnueabi-g++
QMAKE_LINK
= arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB
= arm-none-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR
= arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY
= arm-none-linux-gnueabi-objcopy
QMAKE_NM
= arm-none-linux-gnueabi-nm -P
QMAKE_STRIP
= arm-none-linux-gnueabi-strip
load(qt_config)
这里的 arm-none-linux-gnueabi-gcc 就是刚才指定的交叉编译器,如果交叉编译器没有用环境变量
导入,则需要使用绝对路径,如这里可以直接写作:
/opt/EmbedRigol/arm-gcc/bin/arm-none-linux-gnueabi-gcc
( 3 )去掉 3d 编译
qt3d 和 qtcanvas3d 在编译的时候会报错,说是未识别模块,而且嵌入式没有 opengl ,即便识别也
会报错导致编译失败。在编译配置参数里面也没有这两个模块的配置。因此这里去掉关于 3d 方面的编译
选项。
打开 qt 根目录下的 qt.pro 文件,注释掉下面两句:
#addModule(qt3d, qtdeclarative qtimageformats)
#addModule(qtcanvas3d, qtdeclarative)
( 4 )配置编译参数
创建 run_config 文件,并增加可执行权限( chmod a+x run_config ),内容填充如下:
./configure -release -opensource -xplatform linux-arm-gnueabi-g++ -prefix
/opt/EmbedRigol/install-dev/qt-5.5.1 -confirm-license -no-iconv -no-c++11 -no-opengl
说明:
-xplatform 后面指定平台,也就是刚才指定的交叉编译器 qmake 配置文件的文件夹名 linux-arm-
gnueabi-g++
-prefix 后面跟 qt 编译后执行 make install 的安装路径
-confirm-license 相当于同意一个协议
-no-opengl 为了不编译 3d 参数,这里增加 ” -no-opengl ” 参数,其他参数如下
配置完成后执行
./run_config


随后,执行

make -j8等编译结束后执行
make install
此时, qt 被安装在 -prefix 指定的路径中即 /opt/EmbedRigol/install-dev/qt-5.5.1 ,可以进入路径可以查
看如下


备注:编译过程当中错误

( 1 ) 编译器找不到错误


解决方案:配置编译器的环境变量, sudo gedit /etc/bash.bashrc 在文件当中加入

export
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home
/hml/software/arm-gcc-4.8/arm-2014.05/bin"
上面的错误有时配置完成环境变量也会出现,原因是环境变量未生效
在终端输入检测环境变量是否生效,在 root 用户和非 root 用户都做检查: echo $PATH 检查环境变量是
否配置正确,输入 : arm-none-linux-gnueabi-g++ -v
环境变量配置网站: http://blog.chinaunix.net/uid-24612247-id-88176.html

( 2 )重复编译过程中出现了这个错误


解决方案:重新解压文件,重新设置配置选项,重新 make make install 即可。

总之出现 Could not determine the target architecture! 等错误,一 检查
qtbase/mkspecs/linux-arm-gnueabi-g++/ 目录下的 qmake.conf 配置,二 检查编译器的环境变量配置
3.3 移植到开发板
( 1 )打包拷贝
为了保证源文件的原有属性,这里采用先压缩后解压到开发板的模式。执行下面压缩语句将安装好
的 qt 包压缩。
tar -cjvf qt-5.5.1.tar.bz2 qt-5.5.1
压缩后如下所示
( 2 )将压缩后的文件解压到开发板的文件系统中
我这里解压到文件系统的 usr/local/ 文件夹下,完整的路径是 usr/local/qt-5.5.1 。
( 3 )设置开发板的环境变量
打开开发板文件系统中 etc 文件夹下的 profile 文件,编辑如下
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/qt-5.5.1/bin
export PATH
#set hostname
HOSTNAME='/bin/hostname'
export HOSTNAME
# Set PS1
PS1='[\u@\h \W]\$'
export PS1
# qt path
export QTDIR=/usr/local/qt-5.5.1
export LD_LIBRARY_PATH=/lib:$QTDIR/lib:$LD_LIBRARY_PATH
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event1
export QML2_IMPORT_PATH=$QTDIR/qml
启动开发板时会自动根据此文件设置开发板的环境变量。
4. 移植一个 qt 程序到开发板
前面的移植相当于对开发板配置了 qt 的运行环境,当有 qt 程序时,可以直接运行与此环境之上。
4.1 先跑一个 qt 自带的例子程序
在 qt 的源码安装路径中有一个 examples 文件夹,其中存放了部分 qt 的测试程序。例如

examples/touch/pinzoom/pinchzoom 程序的执行结果应该如下图所示。


( 1 ) 进入文件执行 ./pinchzoom ,提示错误信息(该错误有可能不会出现)
/bin/sh .fluidlauncher : not found
解决方案:
[1] 直接将编译 qt 的编译器 arm-none-linux-gnueabi- 对应目录下 /home/hml/software/arm-
gcc-4.8/arm-2014.05/arm-none-linux-gnueabi/libc 所有 .so 文件拷贝到开发板 lib 目录。
[2] 采用 arm-none-linux-gnueabi-readelf -d fluidlauncher


只在 /home/hml/software/arm-gcc-4.8/arm-2014.05/arm-none-linux-gnueabi/libc 下复制途中对应

的 .so 文件到开发板目录即可
( 2 )进入文件夹,执行 ./pinchzoom ,提示错误信息:./pinchzoom: error while loading shared libraries: libQt5Widgets.so: cannot open shared object file:
No such file or directory
解决方案:
将 qt-5.5.1/lib 文件夹下的 libQt5Widgets.so 相关文件拷贝到开发板的 lib 文件夹下
( 3 )重新执行 ./pinchzoom ,提示错误信息:
./pinchzoom: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No
such file or directory
解决方案 1 :
将交叉编译器( /opt/EmbedRigol/arm-gcc/arm-none-linux-gnueabi-gcc/libc/usr/lib )中的
libstdc++.so.6 相关文件拷贝到开发板的 lib 文件夹下。
( 4 )解决后重新执行 ./pinchzoom ,提示错误信息:
Cannot find libdbus-1 in your system to resolve symbol 'dbus_get_local_machine_id'.
Aborted
原因是没有 libdbus-1.so 库,所以需要移植。
移植 dbus
-----------------------------------------------------------------------------------------------------------------------
libdbus.so 源码的下载网址为 http://dbus.freedesktop.org/releases/dbus/ ,我这里下载 1.2.30 版本,
并解压在 /opt/EmbedRigol/ 文件夹下,完整路径是 /opt/EmbedRigol/dbus-1.2.30 。进入源码目录,执行
下面的语句进行编译配置:
./configure --host=arm-linux –prefix=/opt/EmbedRigol/install-dev/dbus-1.2.30 CC=arm-none-
linux-gnueabi-gcc --without-x
提示错误
configure: error: Could not find expat.h, check config.log for failed attempts
原因是需要现安装 expat 。。。
下载 expat ,网址是 http://sourceforge.net/projects/expat/files/expat/ ,解压在 /opt/EmbedRigol/
文件夹下,完整路径是 /opt/EmbedRigol/expat-2.1.0 。进入该路径后执行如下命令:
CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=/opt/EmbedRigol/install-
dev/expat-2.1.0
其中安装路径是 /opt/EmbedRigol/install-dev/expat-2.1.0 ,接下来执行 make 和 make install 。安装后
文件如下图所示:


然后回来再编译 dbus ,切换目录至 /opt/EmbedRigol/dbus-1.2.30 ,执行命令:

CC=arm-none-linux-gnueabi-gcc ./configure CFLAGS=-I/opt/EmbedRigol/install-dev/expat-
2.1.0/include LDFLAGS=-L/opt/EmbedRigol/install-dev/expat-2.1.0/lib
--prefix=/opt/EmbedRigol/install-dev/dbus-1.2.30 --host=arm-linux --enable-abstract-sockets
其中, CC 指定编译器, CFLAGS 指定额外的 .h (这里是 expat.h )的路径, LDFLAGS 指定 expat 的
库位置, prefix 指定 dbus 的安装路径, host 指定移植后的运行环境, enable-abstract-sockets 是过滤
交叉编译器检查的。
执行完 .configure 后完成编译配置,随后执行 make 和 make install 进行编译和安装。安装后文件如

下所示:

-----------------------------------------------------------------------------------------------------------------------

移植完 dbus 库后,将 /opt/EmbedRigol/install-dev/dbus-1.2.30/lib 文件夹下 libdbus-1.so 相关的
文件拷贝到开发板的 lib 文件夹下。
( 4 )重新执行 ./pinchzoom ,提示错误信息:
process 85: D-Bus library appears to be incorrectly set up; failed to read machine uuid: Failed to
open “/opt/EmbedRigol/install-dev/dbus-1.2.30/var/lib/dbus/machine-id”: No such file or directory
See the manual page for dbus-uuidgen to correct this issue.
D-bus not built with -rdynamic so unable to print abacktrace
Aborted
解决方案:在 qt/qtbase/mkspecs/linux-arm-gnueabi-g++/ 目录下的 qmake.conf 文件中添加如下几
句,用以指定 dbus-1 的安装路径和库路径。
QMAKE_INCDIR
QMAKE_INCDIR
QMAKE_LIBDIR
+= /opt/EmbedRigol/install-dev/dbus-1.2.30/include/dbus-1.0
+= /opt/EmbedRigol/install-dev/dbus-1.2.30/lib/dbus-1.0/include
+= /opt/EmbedRigol/install-dev/dbus-1.2.30/lib
然后配置 qt 的编译参数,输入如下:
./configure -release -opensource -xplatform linux-arm-gnueabi-g++ -prefix
/opt/EmbedRigol/install-dev/qt-5.5.1 -confirm-license -no-iconv -no-opengl -no-c++11 -dbus
即,增加 -dbus 参数,然后重新编译安装( make 和 make install )。
重复 3.3 节操作,移植到开发板上。
解决上述提示的的 machine-id 问题:在 pc 上执行下面语句:
dbus-uuidgen > /opt/EmbedRigol/install-dev/dbus-1.2.30/var/lib/dbus/machine-id
如果没有相应目录请按照错误提示将路径建立完整,然后将生成的 machine-id 文件以及完整路径复制到
开发板文件系统中即可。
( 5 )重新执行 ./pinchzoom4.2 将开发好的 QT 程序移植到开发板
利用 QT Creator 软件开发 qt 程序,把编译好的可执行文件和所需要的字体库、链接库等文件拷贝

到开发板的的 QT 相应目录下,执行该程序即可。


  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值