师兄让我作达芬奇系统下的一个界面程序,听说QT不错,所以几天前就试着把QT移植到dm6446上来。去TI的论坛看了一个在omap3上的移植教程,看起来也不难,于是开始了我的移植过程。
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完成,这样会很迷惑人,会导致人犯错。

转载于:https://www.cnblogs.com/ganrui/p/3708017.html

QT4.7.3在dm6446平台上的移植[转]--make[1]: *** [assistant_cs.qm] Error 2相关推荐

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

    1 首先去http://qt.nokia.com/downloads下载最新的QT原代码包:qt-everywhere-opensource-src-4.6.4.tar.gz 可以将其放在/tmp目录 ...

  2. opus在arm的嵌入式平台上的移植和开发

    最近产品中要用到opus,圣上一声令下,把opus移植到我们平台上,什么?opus?opus是什么?在一脸 茫然中,我这特种兵码农就赤手空拳上战场了. 废话少说,赶紧在网站:https://opus- ...

  3. Ubuntu-Base 18 文件系统 在iMX8平台上的移植

    Ubuntu-Base 18 文件系统 在iMX8平台上的移植 开发板是如下的型号 OKMX8MPX-C V2.0 OKMX8PQ-C开发板 FETMX8MPX-C V1.0 在 飞凌 提供的 ubu ...

  4. miniGUI 3.0.2 在Hi3535平台上的移植

    miniGUI是一个自由软件项目.其目标是提供一个快速.稳定.跨操作系统的图形用户界面(GUI)支持系统,尤其是基于 Linux/uClinux.eCos 以及其他传统 RTOS(如 VxWorks. ...

  5. 锐捷认证客户端在嵌入式linux平台上的移植

    一.TCP/IP协议简介 IP协议用于将多个包交换网络连接起来,IP不提供可靠的传输服务,它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流 ...

  6. Ubuntu-Base在iMX8MM平台上的移植

    先说废话↓ 转眼大学快过完了,已经开始了毕业设计的开发.笔者的毕业设计是一个运行ARM-Linux的第一人称控制机器人,为了挑(zhe)战(mo)一下自己,选择了一个性能很美丽的平台--iMX8MM, ...

  7. 创维 linux内核,Linux2.6内核在创维特jx2410平台上的移植四

    Ne2000兼容的网卡移植 1.首先修改arch/arm文件夹下的Kconfig文件的ISA项如下: config ISA bool "gggggg ISA support" de ...

  8. 创维 linux内核,Linux2.6内核在创维特jx2410平台上的移植一

    我参考网上的资料做了linux2.6.14内核的移植.创维特jx2410的配置:cpu:s3c2410, 32M Nor Flash(Intel 28F128), 64M SDRAM.Nor Flas ...

  9. FFTW3在android平台上的移植

    目的:编译arm64-v8a armeabi-v7a架构的动态库 编译环境:ubuntu 64 + android-ndk-r10e 注意事项:一定要保证android-ndk-r10e的有足够的权限 ...

最新文章

  1. 创建自己的人脸识别系统
  2. Ubuntu18.4 中 eBPF bcc环境搭建
  3. django-vue-admin前端设置后台接口地址为127.0.0.1产生跨域问题解决办法
  4. vue项目安装less_部署vue项目、安装mongodb
  5. socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)
  6. python办公室妙用-python eval()函数的妙用和滥用
  7. IDL size函数
  8. 车牌识别sdk android,Android车牌识别sdk
  9. 使用spring提供的URL多级路径匹配器
  10. 故宫回应灯会票秒光:3500人约成功 没票别信黄牛
  11. Ubuntu 18.04.3 LTS - 安装 Spring Tool Suite 4
  12. 萌爪医生微信小程序内部服务器错误,企业微信提示网络错误怎么回事
  13. Java多线程游戏-雷霆战机
  14. 一分钟了解:NMN的副作用和危害?nmn对人体有害吗?
  15. Java 将控制台输出打印 输出到本地文件
  16. vmware下虚拟机centos,root登录时候提示鉴定故障解决方法
  17. imac起死回生,在iMAC 27 2011 mid 上裸机安装windows10
  18. 动画,在我眼中,详细
  19. python数据类型的性能
  20. iOS 照片存储到沙盒 和读取

热门文章

  1. Debian 10(buster) 更换国内软件源
  2. 政策解读:《智能硬件产业创新发展专项行动(2016-2018年)》(下)
  3. 《OSPF网络设计解决方案(第2版)》一第2章 介绍OSPF
  4. 项目的ip地址更改,用git从远程提取代码出现错误,提示为 network error connection timed out...
  5. VTK中导入并显示STL、3DS文件
  6. JVM学习(1)——通过实例总结Java虚拟机的运行机制(转)
  7. mysql profile使用(转)
  8. (转)android UI进阶之自定义组合控件
  9. C++ STL学习笔记(5) Vector容器, array容器,deque容器
  10. windows10下 tensorflow gpu版本安装配置方法