GrabDuck

QT4.8.2在hi3531上的移植 - tongxinxiao的专栏 - CSDN博客

:

1.准备工作

(1)源代码:qt-embedded-linux-opensource-src-4.8.2

下载地址:ftp://ftp.qt.nokia.com/qt/source/

参考资料:http://tengfeioffice.blog.163.com/blog/static/17180706720127105421372/

 2)安装好的交叉编译器:由于hi3531提供了两个交叉编译器:arm-hisiv100-linuxarm-hisiv200-linux,其所在路径为:/opt/hisi-linux/x86-arm。(在这里主要用到的是arm-hisiv100-linux,故主要移植该类型)

  3)在IP尾号147linux服务器上的/opt路径下新建Qt库所安放的文件夹qte/$ mkdir  /opt/qte

2.移植过程及注意事项

2。1 移植步骤

1)下载源码:qt-embedded-linux-opensource-src-4.8.2.tar.gz压缩包

将源码复制到/usr/local/,并解压缩: /usr/local$   tar zxvf qt-everywhere-opensource-src-4.8.2.tar.gz

2)解压后,进入安装目录,然后需要配置交叉编译环境,由于hi3531用的不是普通的arm编译器,所以要配置自己的交叉编译环境,首先进入mkspecs/qws/目录/usr/local/qt-everywhere-opensource-src-4.8.2/mkspecs/qws/$  cp -r linux-arm-g++   linux-hisi3531-g++(这主要是为编译源代码提供交叉编译环境),
 3)修改linux-hisi3531-g++目录下的qmake.conf文件,将所有的arm-linux-替换成opt/hisi-linux/x86-arm/arm-hisiv100-linux/target/bin / arm-hisiv100-

交叉编译器路径和名称,然后保存。

其该变化的具体内容:

# modifications to g++.conf

QMAKE_CC     = /opt/hisi-linux/x86-arm/arm-hisiv100-linux/target/bin/arm-hisiv100-linux-gcc

QMAKE_CXX   = /opt/hisi-linux/x86-arm/arm-hisiv100-linux/target/bin/arm-hisiv100-linux-g++

QMAKE_LINK  = /opt/hisi-linux/x86-arm/arm-hisiv100-linux/target/bin/arm-hisiv100-linux-g++

QMAKE_LINK_SHLIB    = /opt/hisi-linux/x86-arm/arm-hisiv100-linux/target/bin/arm-hisiv100-linux-g++

# modifications to linux.conf

QMAKE_AR      = /opt/hisi-linux/x86-arm/arm-hisiv100-linux/target/bin/arm-hisiv100-linux-ar cqs

QMAKE_OBJCOPY  = /opt/hisi-linux/x86-arm/arm-hisiv100-linux/target/bin/arm-hisiv100-linux-objcopy

QMAKE_STRIP   = /opt/hisi-linux/x86-arm/arm-hisiv100-linux/target/bin/arm-hisiv100-linux-strip

4)返回源码包路径下,进行./configure

/usr/local/qt-everywhere-opensource-src-4.8.2#./configure –prefix /opt/qte -embedded arm -platform linux-g++ -xplatform qws/linux-hisi3531-g++ -depths 15,16,24 -little-endian -no-largefile -no-accessibility -no-qt3support -no-xmlpatterns -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-svg -no-webkit -no-javascript-jit -no-script -no-scripttools -no-declarative -no-declarative-debug -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon -no-openssl -no-cups -no-dbus -nomake examples -nomake demos  -nomake docs

5)此时,系统能configure过去,但不能makemake会报错如下:

obj/release-shared-emb-mips/qthread_unix.o:In function `set_thread_data(QThreadData*)':

qthread_unix.cpp.text+0xec): undefined reference to `__tls_get_addr'

.obj/release-shared-emb-mips/qthread_unix.o: In function `QThreadData::current()':

qthread_unix.cpp.text+0x708): undefined reference to `__tls_get_addr'

collect2: ld returned 1 exit status

这时可以去源码包中的src/corelib/thread目录下的qthread_unix.cpp文件, 发现HAVE_TLS宏打开了才会导致错误,关掉该宏后再编译, 果然通过了。

如下面的修改:

enum { ThreadPriorityResetFlag = 0x80000000 };

#if defined(Q_OS_LINUX) && defined(__GLIBC__) && (defined(Q_CC_GNU) || defined(Q_CC_INTEL))

//#define HAVE_TLS(屏蔽此行)

#endif

#if defined(Q_CC_XLC) || defined (Q_CC_SUN)

#define HAVE_TLS

#endif

#ifdef HAVE_TLS

static __thread QThreadData *currentThreadData = 0;

#endif

static pthread_once_t current_thread_data_once = PTHREAD_ONCE_INIT;

(6)在./configure之后,/usr/local/qt-everywhere-opensource-src-4.8.2#make

(7)make之后,/usr/local/qt-everywhere-opensource-src-4.8.2#make install

(8)设置环境变量:

export QTDIR=/opt/qte

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

export QMAKESPEC=$QTDIR/mkspecs/default

为了方便,可以将其内容写脚本qt。

#! /bin/sh

export QTDIR=/opt/qte

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

export QMAKESPEC=$QTDIR/mkspecs/default

并将该脚本修改权限:

在qt的当前路径下,使qt生效。/opt/qte# source qt。再查看当下qmake的版本号:即在该目录下:/opt/qte#qmake  –v;出现

QMake version 2.01a

Using Qt version 4.8.2 in /opt/qte/lib

即表示库移植成功了。

(9)用例程来考证:

  在源码包路径下examples/dialogs/extension#qmake  –project

                 examples/dialogs/extension#qmake 

                          examples/dialogs/extension#make

即能生成可执行文件

2。2 注意事项

为什么要选择hisiv100交叉编译器?

答:在hisiv100交叉编译器中存在arm-hisiv100-linux-uclibcgnueabi,该编译器是基于uclibc的,而hisiv200交叉编译器中存在arm-hisiv200-linux-gnueab,说明该编译器是基于glibc的。而uclibc和glibc的区别是:

1、uClibc 是一个小型的 C 库,应用于嵌入式 Linux 系统开发。它基本实现了 glibc 的功能,几乎所有 glibc 支持的应用程序都能在 uClibc 上运行,这使得应用程序的移植变得相当简单,只需要使用 uClibc 库重新编译源代码就可以了。目前 uClibc 主要运行在不带 MMU 的平台下,支持 alpha, ARM, i386, i960, h8300, m68k, mips/mipsel, PowerPC, SH, SPARC 等等。

2、uClibc比Glibc小,虽然uClibc和Glibc在已有的接口上是兼容的,而且采用uClibc编译应用程序比采用Glibc编译应用程序要更方便,但是uClibc并没有包括Glibc中的所有接口实现,因此有些应用可能在uClibc中不能编译。
3、 uClibc在可配置性上比Glibc要好。
4、 uClibc并不能保证发布的库二进制兼容旧版本uClibc库。当一个新的版本uClibc库被发布,则可能需要也可能不需要重新编译应用程序。