系统环境:
PC :ubuntu 10.04
arm:jz2440 arm920t armv4tl
交叉编译器 : arm-none-linux-gnueabi 4.3.2
源文件:qt-everywhere-opensource-src-4.7.3.tar.gz 下载地址 : http://pan.baidu.com/s/1cMI3v
1.把源文件解压到某个目录下面,我放在了/usr/local/下,解压
tar -xvfz qt-everywhere-opensource-src-4.7.3.tar.gz
2.创建一个目录用来存放编译出来的arm版本qt
mkdir qt-4.7.3-linux-arm-install [有权限问题的话使用sudo]
3.进入qt-everywhere-opensource-src-4.7.3进行配置、编译、安装
-------------------------------------------------------------------------------------------------------------------------
3.1配置
这一步比较麻烦也很关键,在我make的过程中出现了各种错误,基本上都是因为配置的漏洞。
如果你直接./configure的话,编译的是针对X86的X11的qt库,所以你需要在./configure 後添加-embedded arm的选项,还需要制定交叉编译器,所以就需要在qt源码包下使用:./configure -embedded -help来查看该 源码包支持那些配置选项,可以大概了解一下。
首先,在配置之前需要修改一个文件,源文件目录下的/mkspecs/qws/linux-arm-g++下面的qmake.conf
book@book-desktop:/usr/local/qt-everywhere-opensource-src-4.7.3$ cat mkspecs/qws/linux-arm-g++/qmake.conf
#
# qmake configuration for building with arm-linux-g++
#
include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)
# modifications to g++.conf
QMAKE_CC = /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc -lts
QMAKE_CXX = /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK = /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB = /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR = /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-objcopy
QMAKE_STRIP = /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-strip
QMAKE_CFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
QMAKE_CXXFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
load(qt_config)
下面来一一说明:
这里面指定了制作qmake的路径,如果之前韦老师的ubuntu里面安装了qmake的话可以通过which qmake查看一下,我的里面是安装好了的,但是那个是X86版本的,不能使用,可以用file命令来查看版本,于是我把那个删除掉了,需要使用这之后编译生成的arm版本的qmake。
A:
这里我指定了绝对路径,因为即使你再environment里面指定了arm-none-linux-gnueabi-g++的路径了,但有时候还是不太靠谱,make的时候还会提示:
- make[1]: arm-none-linux-gnueabi-g++:命令未找到
- make[1]: *** [.obj/release-shared-emb-arm/qatomic_arm.o] 错误 127
所以干脆整成绝对路径保险。
B:
之所以在QMAKE_CC = /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc 后面加上-lts是因为在配置编译过程中出现了如下错误:
libQtCore.so: undefined reference to `clock_gettime'
可以参考这里的说明: http://blog.163.com/zhangliye_2009/blog/static/1223120282013518104148904/
C:
QMAKE_CFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
QMAKE_CXXFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
这两行之所以加进去是因为我最终把编译的库文件都放到开发板上之后,试图运行测试程序,却出现了如下错误:
# ./helloworld -qws
Illegal instruction
可以参考这篇文章的说明: http://blog.csdn.net/jianwushuang/article/details/7348797或者下面这篇
http://blog.chinaunix.net/uid-20648944-id-2982576.html
其次,运行程序在ARM板上得到“illegal instruction”,后来查了好多资料才知道是下面这个文件捣的鬼:
/usr/local/qt-everywhere-opensource-src-4.7.3/mkspecs/common/g++.conf
将里面的QMAKE_CFLAGS_RELEASE += -O2
改成:
QMAKE_CFLAGS_RELEASE += -O0
这些问题这得很蛋疼,参考 http://blog.csdn.net/dy_lengleng/article/details/6096671
再次,修改完那个文件之后可以进行配置选项的设置了,我参考了网上的文章进行了一些修改,然后就出来了如下的内容:
./configure -prefix /usr/local/qt-4.7.3-linux-arm-install -embedded arm -little-endian -no-cups -no-webkit -no-3dnow -nomake examples -nomake demos -nomake docs -xplatform /qws/linux-arm-g++ -lrt
参考文章: http://blog.chinaunix.net/uid-29181887-id-3922301.html郭大侠
关于旋转界面参考这里: QT旋转界面
-------------------------------------------------------------------------------------------------------------
3.2 编译
直接执行make,或者sudo make,大概需要2~3个小时。
-------------------------------------------------------------------------------------------------------------
3.3安装
执行make install
然后就会将arm版本的qt安装在/usr/local/qt-4.7.3-linux-arm-install这个目录里面。
-------------------------------------------------------------------------------------------------------------
4.将/usr/local/qt-4.7.3-linux-arm-install/lib目录下的所有文件拷贝到网络文件系统的qt库文件下,
cp * /work/nfs_root/second_fs_4.3.2/opt/Qtopia/lib/ -dr
5.测试 ARM 版 QT 是否安装并配置成功:
a. 执行:qmake -v
打印以下对应信息:
QMake version 2.01a
Using Qt version 4.7.3 in /usr/local/qt-4.7.3-linux-arm-install/lib
b. 执行:which qmake
打印以下对应信息:
/usr/local/qt-4.7.3-linux-arm-install/bin/qmake
6.
编写一个简单的测试程序,文件名为hello.cpp,进入该文件目录,进行工程编译,看是否能正确通编译
hello.cpp源码:
#include <QApplication>
#include <QDebug>
int main(int argc,char *argv[])
{
qDebug("Hello, welcome to Qt world!");
return 0;
}
顺序执行以下操作:
@1. 执行:qmake -project hello1.cpp
生成 hello1.pro 工程文件
@2. 执行:qmake hello1.pro
生成 Makefile 文件
@3. 执行:make
生成 hello.o, hello 文件
如果执行@2步骤时出现以下错误:
QMAKESPEC has not been set, so configuration cannot be deduced.
Error processing project file: hello1.pro
则是 QMAKESPEC 变量没有设置好,执行:
export QMAKESPEC=/usr/local/qt-4.7.3-linux-arm-install/mkspecs/qws/linux-arm-g++
或者将这个配置选项加入系统的/etc/profile文件中,不用每次都进行设置,使用source /etc/profile让修改立即生效,不用重启。
我的修改后在文件后面加上了如下内容:
#FOR QT4
ARMQTDIR=/usr/local/qt-4.7.3-linux-arm-install
PATH=$ARMQTDIR/bin:$PATH
LD_LIBRARY_PATH=$ARMQTDIR/lib:$LD_LIBRARY_PATH
QMAKESPEC=/usr/local/qt-4.7.3-linux-arm-install/mkspecs/qws/linux-arm-g++
export QTDIR PATH LD_LIBRARY_PATH
如果以上对应的信息都能正确打印,说明 ARM 版 QT 安装并配置成功,大功告成,可以你的ARM版QT之旅了!
在arm板上我的执行结果如下:
# ./helloworld -qws
hello
另外还有就是如果运行测试程序的时候出现缺少libstdc++.so.6的话是因为缺少一些标准库文件:
book@book-desktop:~$ cd /usr/local/arm/
book@book-desktop:/usr/local/arm$ find -name "libstdc++.so.6"
./4.3.2/arm-none-linux-gnueabi/libc/thumb2/usr/lib/libstdc++.so.6
./4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/libstdc++.so.6
./4.3.2/arm-none-linux-gnueabi/libc/usr/lib/libstdc++.so.6
将里面的./4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/里的内容复制到开发板的/lib目录下面。
【另外,如果在执行make的时候突然卡住了,一般卡在了webkit的编译上面,不要退出,跟他耗着啊,一般要十几二十来分钟他才能编译通过的,我之前以为编译过程over了呢,于是重新配置,重新编译,冲锋了三次都没冲过去啊,原来,不需要的,只要等着她就ok了,或者如果还有问题,那就干脆把webkit这个模块去掉,如果不用的话,不要编译进去了就行了】