现在的位置: 首页 > 综合 > 正文

Qt/E 的交叉编译

2013年10月08日 ⁄ 综合 ⁄ 共 3292字 ⁄ 字号 评论关闭

二  Qt/E 的交叉编译
 
   要将我们写好的程序发布到开发板上,我们需要对Qt/Embedded 重新编译,与前面在宿主机上编译类似,步骤如下:
1. Build Qt/Embedded
tar –xzvf qt-embedded-2.3.10-free.tar.gz
mv  qt-2.3.10  qt-2.3.10-target
export TMAKEDIR=$PWD/tmake-1.13
export QT2DIR=$PWD/qt-2.3.2
export QTEDIR=$PWD/qt-2.3.10-target
cd $QTEDIR
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
export QTDIR=$QTEDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
make  clean
./configure -xplatform linux-arm-g++ -no-xft -no-qvfb -depths 4,8,16,32
make
出现
/public/qt/qt-2.3.10-target/lib/libqte.so: undefined reference to `operator new[](unsigned int)'
/public/qt/qt-2.3.10-target/lib/libqte.so: undefined reference to `operator delete(void*)'
/public/qt/qt-2.3.10-target/lib/libqte.so: undefined reference to `__cxa_pure_virtual'
/public/qt/qt-2.3.10-target/lib/libqte.so: undefined reference to `operator delete[](void*)'
/public/qt/qt-2.3.10-target/lib/libqte.so: undefined reference to `operator new(unsigned int)'
collect2: ld returned 1 exit status
make[4]: *** [t1]
暂时不管它,不影响的。下面的第2步: “修改tmake 配置文件”   即可解决此类问题。

这步完成后,我们会在/$QTEDIR/lib/目录下面看到libqte.so libqte.so.2 libqte.so.2.3 libqte.so.2.3.10 这四个文件,我们可以使用file 命令来查看这个库文件是否是我们需要的在开发板上跑的库。
file libqte.so.2.3.10
libqte.so.2.3.10: ELF 32-bit LSB shared object, ARM, version 1 (ARM), stripped
有了这个库以后我们就可以把它拷贝到我们的开发板中相应的库目录下面,这里我们选择了开发板上的/usr/lib 目录,将/$QTEDIR/lib/下的libqte.so*复制到/usr/lib 目录下。
首先要建立宿主机和开发板的通讯,假设本机的ip 地址为192.168.0.56 并且/root/share 为共享文件夹。
cp –arf /$QTEDIR/lib/libqte.so*  /root/share
启动minicom
mount –t nfs –o nolock 192.168.0.56:/root/share /mnt/nfs将文件复制到开发板上
cp –arf /mnt/nfs/libqte.so* /usr/lib
 
2. 修改tmake 配置文件
vi $ TMAKEDIR/lib/qws/linux-arm-g++/tmake.conf
将其中“TMAKE_LINK= arm-linux-gcc”
“TMAKE_LINK_SHLIB= arm-linux-gcc”
修改为:“TMAKE_LINK= arm-linux-g++”
“TMAKE_LINK_SHLIB= arm-linux-g++”
 
3.生成可执行文件 
 这里我们采用了Qt/Embedded自带的一个demo,它在/$QTEDIR/examples/progressbar目录下,这个目录包括下面几个文件: main.cpp、Makefile.in 、progressbar.h 、Makefile、progressbar.cpp、progressbar.pro,如果已经有了progressbar 的执行文件,可以使用make clean删除。
  progen –t app.t –o progressbar.pro
  echo $TMAKEPATH
  查看返回的结果的结尾字符是否是“……/qws/linux-arm-g++”,如果不是的话需要在命令行中重新设置TMAKEPATH
   export TMAKEPATH=/tmake 的安装路径(如$TMAKEDIR)/lib/qws/linux-arm-g++
此外还要使QTDIR指向Qt/Embedded 的安装路径,如:
export QTDIR=$QTEDIR 或者直接指定路径
export QTDIR=……/qt-2.3.10-target
完成了上面的环境变量的设置,并用echo 命令检查无误以后,就可以使用tmake 工具来生成我们需要的makefile 文件,在命令行中输入如下命令:
tmake –o makefile progressbar.pro
make
如果没出现错误的话就可以在当前目录下找到progressbar这个可执行文件,它就是在我们开发板上的相应目录中运行“./progressbar -qws”就可以运行程序了。
 
 注: 1).如果执行命令
[/mnt/nfs]./progressbar -qws
./progressbar: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or direy
     我的解决办法是从编译器目录下查找,并拷贝到开发板/usr/lib/中
 
即拷贝/usr/local/arm/3.4.1/arm-linux/lib/libstdc++.so*  到开发板/usr/lib/中
    2).[/mnt/nfs]./progressbar –qws
./progressbar: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such fy
       方法同上
 
 在板子上:
 [root@hjembed qt_bin]# ./progress -qws
Cannot find font definition file /usr/local/qt-embedded/lib/fonts/fontdir - is ?
[root@hjembed qt_bin]# ls
hello     progress
[root@hjembed qt_bin]# ./hello  -qws
Cannot find font definition file /usr/local/qt-embedded/lib/fonts/fontdir - is ?

出现此问题, 解决办法:
在上面拷贝libqte*.so* 时顺带把fonts目录也一并考入。并设置环境变量。
[root@hjembed qt_bin]# export QTDIR=/usr/
[root@hjembed qt_bin]# export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
[root@hjembed qt_bin]# export PATH=$QTDIR/qt_bin:$QTDIR/bin:$PATH
[root@hjembed qt_bin]# echo $LD_LIBRARY_PATH
/usr//lib:/lib:/usr/lib

 在屏幕上看到了界面, 成功了。

抱歉!评论已关闭.