您的位置:首页 > 编程语言 > Qt开发

天嵌开发版 imx6 移植qt

2015-11-05 18:43 746 查看
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 相应目录下,执行该程序即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: