Qt5.5.1移植到freescale imx6
转自:http://blog.csdn.net/xishuang_gongzi/article/details/49583821一、环境HOST:ubuntu12.04-LTSEmbedded:freescale imx6 Linux-3.0.35CROSS_COMPILE:freescale提供的gcc-4.6.2-glibc-2.13-linaro-multil
转自:http://blog.csdn.net/xishuang_gongzi/article/details/49583821
一、环境
HOST:ubuntu12.04-LTS
Embedded:freescale imx6 Linux-3.0.35
CROSS_COMPILE:freescale提供的gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-
二、下载源码
http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.5/5.5.1/single/qt-everywhere-opensource-src-5.5.1.tar.gz
三、解压
unzip qt-everywhere-opensource-src-5.5.1.tar.gz
cd qt-everywhere-opensource-src-5.5.1
四、指定arm架构、交叉编译器、包含的文件系统头文件、部分编译参数
vi qtbase/mkspecs/devices/linux-imx6-g++/qmake.conf
以下为全部内容,其他平台qtbase/mkspecs/devices/下要是没有单独提供,可以使用qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf,需根据自己平台做相应修改。
五、根据自己实际需求配置QT
配置结果如下:
六、编译安装
1、make
2、make install
七、copy到开发板设置环境变量
1、将qt5.5.1打包拷贝到文件系统/usr/local/下,其中包含了qt5的examples,可以删除。
2、添加QT系统环境变量
vi /etc/profile添加
#for QT
export QT_ROOT=/usr/local/qt5.5.1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib:$QT_ROOT/lib
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts
export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event0
export PATH=/bin:/sbin:/usr/bin/:/usr/sbin
export QML2_IMPORT_PATH=$QT_ROOT/qml
#export QT_QPA_GENERIC_PLUGINS=tslib:$TSLIB_TSDEVICE//如果触摸使用TSlib支持则修改为该句。
#export QT_QPA_EGLFS_FB=/dev/fb1
注:QT触摸屏支持可以不使用tslib。
3、tslib移植及支持请看http://blog.csdn.NET/xishuang_gongzi/article/details/49422879
八、运行例子
注:图懒得截了,从别人处拷贝的。
examples/touch/pinchzoom/pinchzoom
examples/svg/embedded/fluidlauncher/fluidlauncher
九、编译及运行问题记录
1、编译错误:opengles2.cpp:37:25: fatal error: GLES2/gl2.h: No such file or directory
vi qtbase/mkspecs/devices/linux-imx6-g++/qmake.conf
解决:
QMAKE_INCDIR_OPENGL_ES2 = /imx_disk/gq/qt/rootfs/usr/include
QMAKE_LIBDIR_OPENGL_ES2 = /imx_disk/gq/qt/rootfs/usr/lib
2、编译错误:In function `png_reset_crc': png.c: undefined reference to `z_crc32'等,qtbase/src/3rdparty/libpng编译时出现大量z_开头的zlib库函数找不到定义。
解决:
./configure 后添加编译-qt-zlib
qt为了防止自己的zlib库与系统的zlib库冲突。Since Qt Core must export these symbols, define Z_PREFIX to avoid clashes system zlib */
3、编译错误:
运行时出现错误提示
QIconvCodec::convertToUnicode: using Latin-1 for conversion,iconv_open failed
QIconvCodec::convertFromUnicode: using Latin-1 for conversion,iconv_open failed
解决:
./configure 后添加编译 -no-iconv
4、编译错误qtwebkit/lib/libQt5WebKit.so: undefined reference to `jpeg_input_complete'
解决:
./configure 后添加编译-qt-libjpeg
5、编译错误:arm-fsl-linux-gnueabi/bin/ld: warning: libjpeg.so.62, needed by /.....qtwebkit/lib/libQt5WebKit.so, not found (try using -rpath or -rpath-link)
解决:
vi qtbase/mkspecs/devices/linux-imx6-g++/qmake.conf添加
QMAKE_LIBS += -ljpeg
http://blog.sina.com.cn/s/blog_616fb0880100xrjj.html
6、编译错误:
qibusplatforminputcontext.cpp: In member function 'virtual void QIBusPlatformInputContext::reset()':
qibusplatforminputcontext.cpp:117:17: error: 'class QIBusInputContextProxy' has no member named 'Reset'
qibusplatforminputcontext.cpp: In member function 'virtual void QIBusPlatformInputContext::commit()':
qibusplatforminputcontext.cpp:140:17: error: 'class QIBusInputContextProxy' has no member named 'Reset'
解决:
qt编译./configuer 后加上-dbus
7、配置错误:
The Qt D-Bus module cannot be enabled because libdbus-1 version 1.2 was not found.
解决:
参考:找到-prefix目录下的lib文件下的pkgconfig文件夹,打开dbus-1.pc
vi qtbase/mkspecs/devices/linux-imx6-g++/qmake.conf
QMAKE_INCDIR += /imx_disk/gq/qt/rootfs/usr/include/dbus-1.0
QMAKE_INCDIR += /imx_disk/gq/qt/rootfs/usr/lib/dbus-1.0/include
QMAKE_LIBDIR += /imx_disk/gq/qt/rootfs/usr/lib
若rootfs中没有dbus库,则需要移植dbus1.2版本copy到文件系统,添加参数如下
QMAKE_INCDIR += /imx_disk/gq/qt/dbus/dbusinstall_1.2.30/include/dbus-1.0
QMAKE_INCDIR += /imx_disk/gq/qt/dbus/dbusinstall_1.2.30/lib/dbus-1.0/include
QMAKE_LIBDIR += /imx_disk/gq/qt/dbus/dbusinstall_1.2.30/lib
其中dbusinstall_1.2.30是交叉编译dbus1.2后的安装目录。
编译dbus前需要先交叉编译dbus的依赖库expat-2.1.0
Cannot find libdbus-1 in your system to resolve symbol 'dbus_get_local_machine_id'.
Aborted
qt编译./configuer 后加上-dbus
9、编译错误:
/imx_disk/gq/qt/dbus/dbusinstall_1.2.30/lib/libdbus-1.a(dbus-sysdeps-pthread.o): In function `_dbus_pthread_condvar_wait_timeout':
/imx_disk/gq/qt/dbus/dbus-1.2.30/dbus/dbus-sysdeps-pthread.c:273: undefined reference to `clock_gettime'
/imx_disk/gq/qt/dbus/dbusinstall_1.2.30/lib/libdbus-1.a(dbus-sysdeps-pthread.o): In function `_dbus_pthread_condvar_new':
/imx_disk/gq/qt/dbus/dbus-1.2.30/dbus/dbus-sysdeps-pthread.c:206: undefined reference to `pthread_condattr_setclock'
/imx_disk/gq/qt/dbus/dbusinstall_1.2.30/lib/libdbus-1.a(dbus-sysdeps-pthread.o): In function `check_monotonic_clock':
/imx_disk/gq/qt/dbus/dbus-1.2.30/dbus/dbus-sysdeps-pthread.c:353: undefined reference to `clock_getres'
/imx_disk/gq/qt/dbus/dbusinstall_1.2.30/lib/libdbus-1.a(dbus-sysdeps-unix.o): In function `_dbus_get_current_time':
/imx_disk/gq/qt/dbus/dbus-1.2.30/dbus/dbus-sysdeps-unix.c:2071: undefined reference to `clock_gettime'
解决:
vi qtbase/mkspecs/devices/linux-imx6-g++/qmake.conf
QMAKE_LIBS += -lrt
10、编译错误:
qsgvivantevideonode.cpp: In static member function 'static const QMap<QVideoFrame::PixelFormat, unsigned int>& QSGVivanteVideoNode::getVid eoFormat2GLFormatMap()':
qsgvivantevideonode.cpp:64:77: error: 'GL_VIV_I420' was not declared in this scope
解决:方式两种,选一种,我们选第二种
①、
vi ./qtmultimedia/src/plugins/videonode/imx6/qsgvivantevideonode.cpp
const QMap<QVideoFrame::PixelFormat, GLenum>& QSGVivanteVideoNode::getVideoFormat2GLFormatMap()
{
if (static_VideoFormat2GLFormatMap.isEmpty()) {
// static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_YUV420P, GL_VIV_I420);
//this video format needs to be commented because it will have support with kernel 3.10 but not with actual one
static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_YV12, GL_VIV_YV12);
static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_NV12, GL_VIV_NV12);
static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_NV21, GL_VIV_NV21);
static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_UYVY, GL_VIV_UYVY);
static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_YUYV, GL_VIV_YUY2);
static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_RGB32, GL_BGRA_EXT);
static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_ARGB32, GL_BGRA_EXT);
static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_BGR32, GL_RGBA);
static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_BGRA32, GL_RGBA);
static_VideoFormat2GLFormatMap.insert(QVideoFrame::Format_RGB565, GL_RGB565);
}
return static_VideoFormat2GLFormatMap;
}
②
vi rootfs/usr/include/GLES2/gl2ext.h
/* GL_VIV_direct_texture */
#ifndef GL_VIV_direct_texture
#define GL_VIV_YV12 0x8FC0
#define GL_VIV_NV12 0x8FC1
#define GL_VIV_YUY2 0x8FC2
#define GL_VIV_UYVY 0x8FC3
#define GL_VIV_NV21 0x8FC4
#define GL_VIV_I420 0x8FC5 //新增
#endif
值来自于这个patch https://lists.yoctoproject.org/pipermail/meta-freescale/2014-June/008709.html
11、编译错误:
ssl/qsslcontext_openssl.cpp:444:52: error: 'SSL_SESSION' has no member named 'tlsext_tick_lifetime_hint'
解决:
configure编译时添加-no-openssl,即不编译openssl
12、运行错误:
./examples/quick/demos/samegame/samegame
qrc:///demos/samegame/samegame.qml:41:1: module "QtQuick" is not installed
qrc:///demos/samegame/samegame.qml:42:1: module "QtQuick.Particles" is not installed
qrc:///demos/samegame/samegame.qml:41:1: module "QtQuick" is not installed
qrc:///demos/samegame/samegame.qml:42:1: module "QtQuick.Particles" is not installed
解决:
在环境里添加:export QML2_IMPORT_PATH=$QT_ROOT/qml,就能解决qrc:///main.qml:1 module "QtQuick" is not installed这样类似的问题,
$QT_ROOT/qml是你编译安装后会有个文件夹的。
13、运行错误:./examples/quick/demos/samegame/samegame
This plugin does not support createPlatformOpenGLContext!
Failed to create OpenGL context for format QSurfaceFormat(version 2.0, options QFlags(), depthBufferSize 24, redBufferSize -1, greenBufferSize -1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize 8, samples -1, swapBehavior 2, swapInterval 1, profile 0)
Aborted
回答:
The problem is likely that you are using qt quick 2, which requires OpenGL. OpenGL does not support the frame buffer used for the small display.
14、编译错误:
../WTF/wtf/unicode/wchar/UnicodeWchar.h: In function 'bool WTF::Unicode::isAlphanumeric(UChar)':
../WTF/wtf/unicode/wchar/UnicodeWchar.h:136:58: error: 'iswalnum' was not declared in this scope
../WTF/wtf/unicode/wchar/UnicodeWchar.h: In function 'bool WTF::Unicode::isDigit(UChar)':
../WTF/wtf/unicode/wchar/UnicodeWchar.h:137:51: error: 'iswdigit' was not declared in this scope
../WTF/wtf/unicode/wchar/UnicodeWchar.h: In function 'bool WTF::Unicode::isLetter(UChar)':
解决:
vi ./qtwebkit/Source/WTF/wtf/unicode/wchar/UnicodeWchar.h
#ifndef Android
/*add by gq start*/
#include <wctype.h>
typedef unsigned short int UChar;
/*add by gq end*/
//# include <wchar.h>
// typedef wchar_t UChar;
#else
typedef unsigned short int UChar;
#endif
15、编译错误:cc1plus: error: unrecognized command line option '-fuse-ld=gold'
解决:
这是Qt的一个bug:https://bugs.webkit.org/show_bug.cgi?id=89312
在装有gold linker的系统里,编译脚本会加入-fuse-ld=gold选项,但这个选项gcc是不支持的。解决办法是移除该选项,
vi qtbase/configure
CFG_USE_GOLD_LINKER=no
16、编译错误3、arm-fsl-linux-gnueabi/bin/ld: error: arch.o uses VFP register arguments, arch does not
解决:
vi./qtbase/mkspecs/devices/linux-imx6-g++/qmake.conf
#DISTRO_OPTS += hard-float
屏蔽掉该句后
g++编译器就被设置成-mfloat-abi=softfp,不使用hard,即浮点运算使用软件不使用硬件。
17、运行错误:
root@freescale /opt$ ./examples/svg/embedded/fluidlauncher/fluidlauncher
process 2622: D-Bus library appears to be incorrectly set up; failed to read machine uuid: Failed to open "/usr/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 a backtrace
Aborted
解决:
dbus-uuidgen > /usr/var/lib/dbus/machine-id
更多推荐
所有评论(0)