Qt4.7.3在dm6446平台上的移植经验与教训

1 首先去http://qt.nokia.com/downloads下载最新的QT原代码包:qt-everywhere-opensource-src-4.6.4.tar.gz 
可以将其放在/tmp目录下,然后解压
/tmp$ tar zxvf qt-everywhere-opensource-src-4.7.3.tar.gz
2 解压后,进入安装目录,然后需要配置交叉编译环境,由于dm6446用的不是普通的arm编译器,所以要配置自己的交叉编译环境
首先进入mkspecs/qws/目录
/tmp/qt-everywhere-opensource-src-4.7.3$ cd mkspecs/qws/
然后复制一下原来的linux-arm-g++目录到linux-dm6446-g++
/tmp/qt-everywhere-opensource-src-4.7.3/mkspecs/qws$ cp -r linux-arm-g++ linux-dm6446-g++
修改linux-dm6446-g++目录下的qmake.conf文件,将所有的arm-linux-替换成arm_v5t_le-,然后保存
/tmp/qt-everywhere-opensource-src-4.7.3/mkspecs/qws$ cd linux-dm6446-g++/
/tmp/qt-everywhere-opensource-src-4.7.3/mkspecs/qws/linux-dm6446-g++$ vi qmake.conf
在vi中,在命令模式下输入
:%s/arm-linux-/arm_v5t_le-/g
进行替换,然后输入
:wq
保存退出。
3 回到QT安装目录,进行QT的配置。为了尽量减少所占系统资源,加快编译速度,在配置时关闭了很多QT的特性。我的配置参数如下:
./configure -prefix /opt/qt -embedded arm -platform linux-g++ -xplatform qws/linux-dm6446-g++ -depths 16,18,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 demo -nomake docs

然后问题出现了。。。。
这个configure脚本首先是在x86下编译出qmake工具,然后再用qmake去根据目录中的.pro文件来生成makefile
qmake的编译没有任何问题,但qmake编译完后,出现了下面的信息:

Finding project files. Please wait...
Project MESSAGE: Unknown PROJECT: libss
Reading /home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/tools/linguist/lrelease/lrelease.pro
Reading /home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/translations/translations.pro
Project MESSAGE: Unknown PROJECT: libss
  893 projects found.

Creating makefiles. Please wait...
  for /home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/translations/translations.pro

Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /opt/qt

To reconfigure, run 'make confclean' and 'configure'.

它提示找不到libss:
Project MESSAGE: Unknown PROJECT: libss
但是后面又说configure已经完成了。如果这时候不管"Project MESSAGE: Unknown PROJECT: libss"这句警告,去运行make,就会出现下面的错误信息
arm_v5t_le-g++ -Wl,-rpath-link,/home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/lib -fno-exceptions -Wl,-O1 -Wl,-rpath,/opt/qt/lib -Wl,-rpath,/opt/qt/lib -o ../../../bin/lrelease .obj/release-shared-emb-arm/main.o .obj/release-shared-emb-arm/qlibraryinfo.o .obj/release-shared-emb-arm/qsettings.o .obj/release-shared-emb-arm/numerus.o .obj/release-shared-emb-arm/translator.o .obj/release-shared-emb-arm/translatormessage.o .obj/release-shared-emb-arm/qm.o .obj/release-shared-emb-arm/qph.o .obj/release-shared-emb-arm/po.o .obj/release-shared-emb-arm/ts.o .obj/release-shared-emb-arm/xliff.o .obj/release-shared-emb-arm/proitems.o .obj/release-shared-emb-arm/profileevaluator.o    -L/home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/src/tools/bootstrap -lbootstrap 
/opt/mv_pro_5.0.0/montavista/pro/devkit/arm/v5t_le/bin/../lib/gcc/armv5tl-montavista-linux-gnueabi/4.2.0/../../../../armv5tl-montavista-linux-gnueabi/bin/ld: cannot find -lbootstrap
collect2: ld returned 1 exit status
make[1]: *** [../../../bin/lrelease] Error 1
make[1]: Leaving directory `/home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/tools/linguist/lrelease'
make: *** [sub-tools-linguist-lrelease-make_default-ordered] Error 2
提示找不到bootstrap库,而实际上QT中是有这个库的,就在src/tools/bootstrap目录下
可以通过如下命令手动编译这个库
/tmp/qt-everywhere-opensource-src-4.7.3$ cd src/tools/bootstrap/
/tmp/qt-everywhere-opensource-src-4.7.3/src/tools/bootstrap$ ../../../bin/qmake
/tmp/qt-everywhere-opensource-src-4.7.3/src/tools/bootstrap$ make

这样做的话如果再回到qt安装目录运行make的话就不会出现上面的错误,但是还会有别的错:

ilomilo@ilo-milo:~/tmp/qt-everywhere-opensource-src-4.7.3$ make
cd tools/linguist/lrelease/ && make -f Makefile 
make[1]: Entering directory `/home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/tools/linguist/lrelease'
arm_v5t_le-g++ -Wl,-rpath-link,/home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/lib -fno-exceptions -Wl,-O1 -Wl,-rpath,/opt/qt/lib -Wl,-rpath,/opt/qt/lib -o ../../../bin/lrelease .obj/release-shared-emb-arm/main.o .obj/release-shared-emb-arm/qlibraryinfo.o .obj/release-shared-emb-arm/qsettings.o .obj/release-shared-emb-arm/numerus.o .obj/release-shared-emb-arm/translator.o .obj/release-shared-emb-arm/translatormessage.o .obj/release-shared-emb-arm/qm.o .obj/release-shared-emb-arm/qph.o .obj/release-shared-emb-arm/po.o .obj/release-shared-emb-arm/ts.o .obj/release-shared-emb-arm/xliff.o .obj/release-shared-emb-arm/proitems.o .obj/release-shared-emb-arm/profileevaluator.o    -L/home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/src/tools/bootstrap -lbootstrap 
make[1]: Leaving directory `/home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/tools/linguist/lrelease'
cd translations/ && make -f Makefile 
make[1]: Entering directory `/home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/translations'
/home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/bin/lrelease assistant_cs.ts -qm assistant_cs.qm
/home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/bin/lrelease: 1: Syntax error: word unexpected (expecting ")")
make[1]: *** [assistant_cs.qm] Error 2
make[1]: Leaving directory `/home/ilomilo/tmp/qt-everywhere-opensource-src-4.7.3/translations'
make: *** [sub-translations-make_default-ordered] Error 2

这里说的是lrelease的语法错误,这个错误就很令人费解了。如果这个时候怀疑qt源代码有问题的话,估计问题就不能解决了,所以我们要找自己的原因,肯定是哪里弄错了。
这时候我就注意到一个令我很在意的问题,前面configure的时候提示
Project MESSAGE: Unknown PROJECT: libss
libss是什么东西。运行ubuntu的
apt-cache search libss
命令,确实能看到一些关于libss的包,通过Synaptic Package Manager查找libss,发现系统确实装了libss2库,那为什么会出现这个问题呢。而这句话又是什么意思呢
Project MESSAGE: Unknown PROJECT: libss

只能去看configure脚本的源代码了,在源代码中查找"Project MESSAGE"字符串,可惜没有结果。。。那这句警告到底来自哪里呢?然后我就注意到了qt安装目录中有个projects.pro文件,再次查找此字符串,还是没找到,但是我注意到此文件中有另外一个字符串"Unknown PROJECT",所以前面的报错信息肯定是来自此文件。
这一段的代码如下

#process the projects
for(PROJECT, $$list($$lower($$unique(QT_BUILD_PARTS)))) {
    isEqual(PROJECT, tools) {
       SUBDIRS += tools
    } else:isEqual(PROJECT, examples) {
       SUBDIRS += examples
    } else:isEqual(PROJECT, demos) {
       SUBDIRS += demos
    } else:isEqual(PROJECT, libs) {
       include(src/src.pro)
    } else:isEqual(PROJECT, docs) {
       contains(QT_BUILD_PARTS, tools):include(doc/doc.pri)
    } else:isEqual(PROJECT, translations) {
       contains(QT_BUILD_PARTS, tools) {
          include(translations/translations.pri)  # ts targets
       } else {
          !wince*:SUBDIRS += tools/linguist/lrelease
       }
       SUBDIRS += translations                    # qm build step
    } else:isEqual(PROJECT, qmake) {
#      SUBDIRS += qmake
    } else {
       message(Unknown PROJECT: $$PROJECT)
    }
}

可以看出,这段代码的功能是把$PROJECT变量去和 examples demos libs docs tools这些字符串去比较,如果不能匹配,就会报出Unknown PROJECT的错误。等一等,这里我又发现了一样东西:libs
前面出的错是libss,而这里刚好有个libs,不会是巧合吧,我觉得不是巧合,后来的调查也发现这里确实不是巧合。会不会是字符串处理出问题了,在libs后面多加了一个s,或者是写脚本的人手抖了一下,多打了一个s呢?我又回去看configure脚本的源文件,查找QT_BUILD_PARTS字符串,找到了
QT_BUILD_PARTS = $CFG_BUILD_PARTS
这样一行
再查找CFG_BUILD_PARTS
找到了很多代码,因为我关注的是字符串处理,所以下面列出了关于字符串的语句如下:

#setup the build parts
if [ -z "$CFG_BUILD_PARTS" ]; then
    CFG_BUILD_PARTS="$QT_DEFAULT_BUILD_PARTS"

    # don't build tools by default when cross-compiling
    if [ "$PLATFORM" != "$XPLATFORM" ]; then
CFG_BUILD_PARTS=`echo "$CFG_BUILD_PARTS" | sed "s, tools,,g"`
    fi
fi
for nobuild in $CFG_NOBUILD_PARTS; do
    CFG_BUILD_PARTS=`echo "$CFG_BUILD_PARTS" | sed "s, $nobuild,,g"`
done
if echo $CFG_BUILD_PARTS | grep -v libs >/dev/null 2>&1; then
#    echo
#    echo "WARNING: libs is a required part of the build."
#    echo
    CFG_BUILD_PARTS="$CFG_BUILD_PARTS libs"
fi
这段程序的大概意思是先将CFG_BUILD_PARTS初始化为一个默认值QT_DEFAULT_BUILD_PARTS,其内容为
QT_DEFAULT_BUILD_PARTS="libs tools examples demos docs translations"
然后如果交叉编译的话就将tools去掉。之后利用一个循环将不需要build的part去掉(利用sed "s, $nobuild,,g"这条语句)。然后检查CFG_BUILD_PARTS中有没有libs,如果没有就加上,因为这是必备的part。
这样,我又回去看自己的配置参数:
./configure -prefix /opt/qt -embedded arm -platform linux-g++ -xplatform qws/linux-dm6446-g++ -depths 16,18,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 demo -nomake docs

去掉了examples,demo,docs这三个part,等等,demo,这里是demo,而前面是demos,刚好差一个s...................
原来这就是问题所在
sed "s, $nobuild,,g"这句话是去掉一个$nobuild,$nobuild前面有个空格,如果这么处理的话,将字符串"libs tools examples demos docs translations"中去掉" tools",“ examples"," demo"," docs"这四个字符串后就是"libss translations",原来这个libss是这么来的呀,就是这个libss困扰了我整整三天。。。。。

在这里我也要抱怨一下nokia的qt开发人员,为什么不对-nomake后面的参数检查其合法性呢?如果事先检查其合法性,就不会造成我的这种错误了。。。。。

这样,先运行./make distclean
将configure中的-nomake demo改成-nomake demos
就没有前面的libss的错误了
configure完成之后,由于前面运行过make,所以最好先make clean一下,然后运行make,整个make过程大概一个多小时,最后得到了dm6446平台下的libs 和translations,translations不知道是干嘛用的,但libs就是我们需要的库,所以算成功完成了移植。
得到的动态库主要包括下面几个(在lib目录中)
libQtCore.so.4.7.3 
libQtGui.so.4.7.3
libQtNetwork.so.4.7.3
libQtSql.so.4.7.3
libQtTest.so.4.7.3
libQtXml.so.4.7.3 

总结:
到了最后,我才发现,整个移植过程还是比价简单的,配置好交叉编译环境后,只需要两个命令就可以完成移植,一个configure,一个make而已。但是因为我在configure的参数中错误地将-nomake demos写成了-nomake demo,才出现了这一连串的错误,浪费我我三天的时间。现总结几点如下:
1 不要过于依赖别人的代码或配置参数,因为别人的有可能是错的,或者不适合你所用的平台。其实我的-nomake demo这个参数就是从别人那拷贝过来的,结果问题就出在这里。
2 出现问题首先要从自己身上找原因,不要因为编译出现问题就怀疑是源代码有问题。
3 我觉得QT4.7.3的安装文件的configure脚本设计有点缺陷,比如没有对-nomake 后面的参数进行严格的检查,这样如果输入的是非法参数的话就会造成configure的失败。还有就是虽然configure中出现了严重错误,它依然提示configure完成,这样会很迷惑人,会导致人犯错。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值