主题 : 在Red Hat 9上编译Qtopia 2.2.0遇到的若干问题的解决方案 复制链接 | 浏览器收藏 | 打印
奔跑的蜗牛……
级别: 侠客
UID: 11357
精华: 4
发帖: 69
金钱: 565 两
威望: 125 点
贡献值: 4 点
综合积分: 218 分
注册时间: 2009-12-04
最后登录: 2013-04-05
楼主  发表于: 2009-12-28 16:56

 在Red Hat 9上编译Qtopia 2.2.0遇到的若干问题的解决方案

管理提醒: 本帖被 kasim 设置为精华(2009-12-28)
描述:安装这些软件包来开发QT和KDE图形化应用程序
图片:
若干天前试图按照Mini2440使用说明书附录一的说明编译x86-Qtopia 2.2.0,编译过程出现若干个错误。
以下是这些错误的解决方案:
问题一:
没有安装QT开发所需要的软件包。
今天在/opt/FriendlyARM/mini2440/x86-qtopia/目录下使用终端#./build 2>&1|tee x86-Qtopia.log命令重新编译Qtopia 2.2.0,并将日志保存在当前目录下的x86-Qtopia.log文件中。通过查找该文件中编译过程的生成的error标记,得知编译未能通过时因为缺少X11/Xlib.h文件和X11/Xatom.h文件。通过紧接着之前的编译命令
g++  -c -I/usr/X11R6/include -I/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/include -I/usr/X11R6/include -pipe -O2 -Wall -W -DNO_DEBUG -fPIC -DQT_BUILTIN_GIF_READER=0 -DQT_NO_IMAGEIO_JPEG -DQT_NO_IMAGEIO_MNG -DQT_NO_SM_SUPPORT -DQT_NO_XKB  -I/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/src/3rdparty/zlib -I/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/src/3rdparty/libpng  -I3rdparty/kernel -I3rdparty/tools -o tmp/release-shared-linux-g++/tools/qutfcodec.o tools/qutfcodec.cpp
查看包含根目录下的/usr/X11R6/include目录。查看后,该目录有X11子目录,但是没有Xlib.h文件和Xatom.h文件,得知一定是Red Hat Linux系统组件里缺少了什么库或者是包。于是打开
/系统工具>添加或删除软件包
发现在软件开发一项中有一个叫《KDE软件开发》的项目,其说明是“安装这些软件包来开发QT和KDE图形化应用程序”。
于是发现Qtopia 2.2.0编译不通过一定是因为没有安装该软件包的原因。于是安装上了。发现在/usr/X11R6/include/X11/目录下出现了Xlib.h文件和Xatom.h文件。
现在重新编译。仍然没有成功。
附图见上边,Red Hat 9做Qt开发时需要安装的软件包:
编译日志分析,见附件《编译出错的x86-Qtopia.rar 》。


问题二:
编译通不过是因为缺少uuid库。
qpe没法运行就表明qpe没有编译成功,那么也就是qt没有编译成功,而现在又是编译的x86版本的,它用的全部都是系统自带的库和编译器(X86是PC的CPU架构,和交叉编译器无关),那么可以推断出是PC的Linux的问题,而PC的Linux是redhat9,redhat9没有完全安装时至少缺少uuid库,uuid库又是Qt编译时所必须的东东。
我绕了这么大个圈子只想告诉你解决方法:要么重装Redhat9,然后完全安装(真正完全安装的redhat9要4.8G左右);要么安装redhat9的第一张光的RedHat/RPMS/e2fsprogs-1.32-6.i386.rpm,这个就是uuid库的安装包了。

那么初学者该如何知道是缺少什么库才导致编译出错呢?例如本次编译错误所缺少的uuid库。其实方法很简单,在/opt/FriendlyARM/mini2440/x86-qtopia/目录下使用终端#./build 2>&1|tee x86-Qtopia.log命令重新编译Qtopia 2.2.0,并将日志保存在当前目录下的x86-Qtopia.log文件中。通过查找该文件中编译过程的生成的error标记,得知是链接时找不到-luuid命令。具体请看附件《第二次编译出错的x86-Qtopia.rar》。

但是还有一个问题,就是安装了redhat9的第一张光盘的RedHat/RPMS/e2fsprogs-1.32-6.i386.rpm以后,执行ld -luuid的时候,仍然提示找不到-luuid命令。这是为什么呢?难道我们没有成功安装uuid的安装包吗?其实不是,其实在根目录下/lib/目录中,已经成功的安装了libuuid.so.1.2动态链接库了。并且还有个libuuid.so.1的链接。
问题出现这里:我们执行ld链接命令时,链接器查找libuuid.so或者是libuuid.a文件。结果没有找到就提示没有找到命令了。这时只需使用ln命令创建一个名为libuuid.so的符号链接,指向libuuid.so.1.2文件即可。
至此编译友善版x86-Qtopia 2.2.0成功。
./run
顺利进入Qtopia 2.2.0界面。


问题三:
友善之臂x86-Qtopia的hello例子编译好后./run-hello不能运行的问题。
经过查找,得知问题出在hello编译好后安装位置不正确。
我们编译好的hello演示文件,本应安装在/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/image/opt/Qtopia/bin目录下。但是仔细查看./build后自动更新的Makefile文件后发现。hello演示例子被安装到/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/bin目录下了。这就导致运行./run-hello时提示找不到命令的错误。

我们只需修改hello.pro文件中目标目录的变量即可,在./build时便会自动更新Makefile文件中相应的变量。
将hello.pro文件中的
DESTDIR=$(QPEDIR)/bin
修改成
DESTDIR=$(QPEDIR)/image/opt/Qtopia/bin
重新build即可正确安装到目标位置。

另外run-hello脚本也需要修改。
将其最后一行hello -qws修改为bin/hello -qws即可。
即hello的目录在当前目录下的bin目录中。
./run-hello成功运行。
[ 此帖被cs2003happy在2009-12-30 12:53重新编辑 ]
描述:第一次编译错误时的编译日志log
附件: 编译出错的x86-Qtopia.rar (102 K) 下载次数:386
描述:第二次编译错误时的编译日志log
附件: 第二次编译出错的x86-Qtopia.rar (124 K) 下载次数:284
描述:成功编译时的编译日志log
附件: 成功编译的x86-Qtopia.rar (157 K) 下载次数:335
Continue Study of Embedded Linux Development and Application

奔跑的蜗牛……
奔跑的蜗牛……
级别: 侠客
UID: 11357
精华: 4
发帖: 69
金钱: 565 两
威望: 125 点
贡献值: 4 点
综合积分: 218 分
注册时间: 2009-12-04
最后登录: 2013-04-05
1楼  发表于: 2009-12-28 17:08

 如何将编译过程的信息保存成日志

如何获得Linux下make的log?
如何保存控制台对话?
如何将编译过程的信息保存成日志?

编译的过程可能会出错,导致编译过程无法继续进行。详细分析出错信息,有助于解决源码中的语法错误。
那么如何保存配置编译过程的信息?这些信息量很大,都可能超出Shell向上翻滚查看的范围。最好是把编译过程的信息保存成日志文件,方便后面的分析。
举例说明保存编译信息的行命令,它把make过程打印的所有信息都保存在xxx.log中。
$make 2>&1|tee xxx.log
这条命令是编译并保存打印信息。在Linux Shell的设备定义中,“0”表示标准输入,“1”表示标准输出,“2”表示标准出错信息输出。2>&1表示把2设备的信息重定向到1设备;“|”是管道符号,把标准输出的信息直接传递给后面的命令;tee是创建文件并保存信息的工具;xxx.log是文件名。
这种管道的用法在Linux Shell命令中使用非常普遍。编译过程中都可以使用这个方法,生成日志文件,保存到buildlogs目录下。
Continue Study of Embedded Linux Development and Application

奔跑的蜗牛……
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5407
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11054 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2009-12-28 18:03
Good,大多数时间我们都是在解决错误,别人的或者自己的。分析问题的能力比解决问题本身更重要
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
奔跑的蜗牛……
级别: 侠客
UID: 11357
精华: 4
发帖: 69
金钱: 565 两
威望: 125 点
贡献值: 4 点
综合积分: 218 分
注册时间: 2009-12-04
最后登录: 2013-04-05
3楼  发表于: 2009-12-30 13:14

 正确分析问题的方法

感谢总版主kasim的评阅。
这个问题我是若干天前遇到的。迟迟不能解决是因为没有找到正确分析问题的方法。
其实作为初学者,解决问题所花费的时间并没有太多,只是如果没有正确的分析方法,我们将无从下手,将大量时间都浪费在了漫无目的的网上搜索和求助了。
初学者经常会出现这样类似问题。所以论坛里经常会出现很多"我按照您的意思/方法去做了,可出现XX错误。为何"这样的问题描述。而并没有真正通过编译日志分析错误的原因。
总结这篇帖子,意思是帮助初学者包括我自己,学习正确分析问题的方法。
通过本主题和1楼自回帖的方法来分析问题出在哪里。
Continue Study of Embedded Linux Development and Application

奔跑的蜗牛……
级别: 新手上路
UID: 12215
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
贡献值: 0 点
综合积分: 8 分
注册时间: 2009-12-31
最后登录: 2010-01-09
4楼  发表于: 2010-01-03 08:40
学习了!!!
永不止步!!!
战略很重要
级别: 侠客
UID: 12425
精华: 0
发帖: 60
金钱: 300 两
威望: 60 点
贡献值: 0 点
综合积分: 120 分
注册时间: 2010-01-06
最后登录: 2011-09-05
5楼  发表于: 2010-01-10 16:48
我觉得安装最重要的就是要把RedHat9完全安装,这样很多问题都解决了
失败的原因只有一个,那就是半途而废!
级别: 侠客
UID: 12490
精华: 0
发帖: 56
金钱: 290 两
威望: 58 点
贡献值: 0 点
综合积分: 112 分
注册时间: 2010-01-07
最后登录: 2015-09-28
6楼  发表于: 2010-01-14 11:08
很好,解决了不少问题。
失败的原因只有一个,那就是半途而废!
ARM9
级别: 新手上路
UID: 12600
精华: 0
发帖: 26
金钱: 140 两
威望: 28 点
贡献值: 0 点
综合积分: 52 分
注册时间: 2010-01-10
最后登录: 2011-11-04
7楼  发表于: 2010-01-30 09:46
那个run-hello不能开始不能运行,输入make, 然后再run,应该可以
级别: 侠客
UID: 7805
精华: 0
发帖: 52
金钱: 345 两
威望: 111 点
贡献值: 0 点
综合积分: 104 分
注册时间: 2009-07-29
最后登录: 2012-11-21
8楼  发表于: 2010-03-08 12:37
已经装了那个RPM包也这个找不到libuuid.so.1.2,怎么回事?
我要资源。
级别: 新手上路
UID: 16287
精华: 0
发帖: 14
金钱: 75 两
威望: 15 点
贡献值: 0 点
综合积分: 28 分
注册时间: 2010-03-16
最后登录: 2011-04-02
9楼  发表于: 2010-03-17 11:50
再赞一个!