移植Qt时遇到的一些问题:
哈哈,纠结了整整两天的问题得到解决:
首先,先罗列问题,介绍一下问题的背景:
我是在学习Qt中关于QTcpSocket编程的时候,然后突然想到,如果编译成功,我应该怎么移植到ARM板子上呢?所以,就上网偷窥了一下,很多的步骤吧,于是就跟着学习,悲剧的事情啊,在第一步就出现了问题:我在工程文件中用qmake命令生成了makefile文件,但是,用make执行这个Makefile的时候总是出现问题,一大堆的问题:
大概意思就是没有找到库吧,所以所有的头文件都不能通过编译,打开Makefile文件查看,找到Makefile文件中环境变量INCPATH知道make是去哪里找头文件的:
INCPATH= -I/usr/share/qt3/mkspecs/default -I. -I. -I/usr/share/qt3/include
对,就是这个问题,make是自动到对应的qt3中去找头文件,但是呢,自己的工程却是基于qt4代码的,所以,这样的编译根本是不能通过的。但是,又出现了这样的问题?为什么qmake命令会生成qt3的Makefile呢?借助于网络,查阅了很多资料,终于发现了问题的所在:
原来,在我的ubuntu中,有两个qmake文件,一个是基于qt3,一个是基于qt4,但是,如果直接在命令行敲入qmake的话,它默认执行的是qt3中的qmake命令。
终于找到了问题的根源,但是,基于qt4的qmake在哪呢?找啊,肯定在Qt4的安装文件中,果不其然,终于让我给找到了:
/opt/qtsdk-2010.04/qt/bin/qmake
这样,问题就基本得到解决了,在shell命令行里执行qmake命令的时候,我们就加上这样的一个路径/opt/qtsdk-2010.04/qt/bin/qmake,这样,我们就指定执行qt4中的qmake,哈哈,编译通过。。。
两天的时间,居然是这样的问题,还好吧, 挺有成就感,但是,时间真是花的太长了。。。
Qt终于移植成功。。。
现在想好好的整理一下,毕竟这一天下来是太累了。。。多亏了网络。。。很多的问题都是从网络上得到解决。。。
首先呢,就是,这个文档中前面的内容,这么多的文件需要qmake一下生成一系列的文件。。。
1,首先,需要做的是,安装Qt库,这里用的安装包是师兄郝东东发给我的。。。在虚拟机下:ubuntu:/home/yeh2011/Soft/qtEmbed450-arm。
这个文件,以我个人的理解来说,主要是提供一个qmake-arm交叉编译工具和提供一系列的库文件来支持Qt的界面,
然后需要在/root/.bashrc文件中添加下列命令,这些命令的意思就是,添加qmake-arm命令的路径,还有就是增加编译时需要连接的库文件。这里,我对安装包的解压路径为:/usr/local/qtembed450-arm
export PATH=$PATH:/usr/local/qtembed450-arm/bin
export LD_LIBRARY_PATH=$LD_LTBRARY_PATH:/usr/local/qtembed450-arm/lib
export QMAKESPEC=/usr/local/qtembed450-arm/mkspecs/default
当时有这样的疑问?Qt creator中不是包含所有的库吗?为什么还要在虚拟机下安装这些库文件呢?其实,这个不难理解,我们现在开发的Qt界面是脱离了Qt creator这个开发环境的(安装了这个包之后,你就会发现,不需要打开Qt creator软件,只需要敲入命令./findDialog,在虚拟机下就可以弹出你自己开发的界面)。注意,这个findDialog可执行文件,是在qmake之后,然后对Makefile进行make而得到的可执行文件。
2,接下来做的就是,在ARM板子上配置Qt界面的环境。其实,做的和在虚拟机上做的差不多,将在虚拟机上解压得到的Embed450-arm文件下的lib文件中的一系列库和front(字体)拷贝到ARM上的某个文件夹下,例如:/usr/local/qtlib/lib。然后将这个路径添加到LD_LIBRARY_PATH中,你只需要修改文件/etc/profile。
(这里有一个很尴尬的问题,无论我怎么修改这个文件,都不能添加这个路径,所以,只有将文件拷贝到现在的LD_LIBRARY_PATH指向的路径中,但是,不推荐这样的作法)。
3,你现在需要做的只是在虚拟机下对findDialog工程进行交叉编译,此时,会生成.o文件和 我们需要的findDialog文件。你可以用
file findDialog命令来查看这个文件是否支持在arm上运行。(当然是可以的,如果你前面全部配置正确的话)。接下来就是将这个findDialog发送到ARM板上,然后直接运行,就可以了,这是,可以看到ARM上弹出了一个我们已经设计好的对话框。
如图所示:
哈哈,兴奋死我了。。。
4,在将文件下载到ARM板子上以后,出现了很多的问题:
A,./findDialog: error while loading shared libraries: libts-0.0.so.0: cannot open shared object file: No such file or directory。
这个问题就是,路径没有添加正确吧, 我试着加了几次,但是都不能解决,只好将libts-0.0.so.0文件拷贝到LD_LIBRARY_PATH支持的路径中了。。。还好,问题得到解决。
B,
[root@FriendlyARM local]# ./findDialog
QWSDisplay::Data::init: Invalid argument
Client can't attach to main ram memory. Aborted
在我用力的摁下Enter键准备欢呼的时候,出乎意料的弹出了这样的错误,很纠结,也看不懂,但是,也是最容易解决的,就是你不能敲入./findDialog命令,你应该在后面加上-qws.
哈哈,就像这样:
[root@FriendlyARM local]# ./findDialog -qws
完美运行。。。。