QT4.8.2在hi3531上的移植
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提供了两个
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-linux和arm-hisiv200-linux,其所在路径为:/opt/hisi-linux/x86-arm。(在这里主要用到的是arm-hisiv100-linux,故主要移植该类型)
(3)在IP尾号147的linux服务器上的/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过去,但不能make。make会报错如下:
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库被发布,则可能需要也可能不需要重新编译应用程序。
更多推荐
所有评论(0)