交叉编译qt
A. Qt的交叉编译问题
修改QtCreator的配置。
tools-->Options--->Build && Run --->Qt Versions
把你的开发板的编译工具链扔进去。再到你发的那个图里设置。
B. Qt交叉编译遇到的问题
QT相关的安装软件包:
(1) tmake-1.13.tar.gz (编译工具,如progen与tmake)
(2) qt-embedded-2.3.7.tar.gz (提供了qte的库)
(3) qt-x11-2.3.2.tar.gz (为了生成相应的QT工具,如designer和qvfb等)
(4) qtopia-free-1.7.0.tar.gz (QTE的桌面环境程序)
(5) cross-3.3.2.tar.bz2 (交叉编译工具)
一、安装工具
1 安装 tmake
在 linux 命令模式下运行以下命令:
tar xfz tmake-1.11.tar.gz
export TMAKEDIR=$PWD/tmake-1.11
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
export PATH=$TMAKEDIR/bin:$PATH
2 安装 Qt/Embedded 2.3.7
在 Linux 命令模式下运行以下命令:
tar xfz qt-embedded-2.3.7.tar.gz
cd qt-2.3.7
export QTDIR=$PWD
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure –qconfig local–qvfb -depths 4,8,16,32
make sub-src
cd ..
上述命令 ./configure -qconfig -qvfb -depths 4,8,16,32 指定 Qt 嵌入式开发包生成虚拟缓冲帧工具qvfb,并支持 4,8,16,32 位的显示颜色深度。另外我们也可以在 configure 的参数中添加-system-jpeg 和 gif,使 Qt/Embedded 平台能支持 jpeg、gif 格式的图形。
上述命令 make sub-src 指定按精简方式编译开发包,也就是说有些 Qt 类未被编译。Qt 嵌入式开发包有 5种编译范围的选项,使用这些选项,可控制 Qt 生成的库文件的大小,但是您的应用所使用到的一些 Qt 类将可能因此在 Qt 的库中找不到链接。编译选项的具体用法可运行./configure -help 命令查看。
在这一过程的configure中出现了问题:有一个变量没有声明,发现是少了一个头文件,加上即可,make顺利通过,看到了enjoy!
3 安装 Qt/X11 2.3.2
在 Linux 命令模式下运行以下命令:
tar xfz qt-x11-2.3.2.tar.gz
cd qt-2.3.2
export QTDIR=$PWD
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -no-opengl
make
make -C tools/qvfb
mv tools/qvfb/qvfb bin
cp bin/uic $QTEDIR/bin
cd ..
根据开发者本身的开发环境,也可以在 configure 的参数中添加别的参数, 比如-no-opengl 或-no-xfs,可以键入./configure -help 来获得一些帮助信息。
在这个安装过程中也出现了很多错误,典型的就是在make过程中:
/usr/local/qt-2.3.2/include/qvaluestack.h:57: error: cannot convert 'QValueListIterator<QMap<QString, QString> >' to 'const char*' for argument '1' to 'int remove(const char*)'
/usr/local/qt-2.3.2/include/qvaluestack.h: In member function 'T QValueStack<T>::pop() [with T = QString]':
xml/qxml.cpp:2502: instantiated from here
/usr/local/qt-2.3.2/include/qvaluestack.h:57: error: cannot convert 'QValueListIterator<QString>' to 'const char*' for argument '1' to 'int remove(const char*)'
make[2]: *** [xml/qxml.o] Error 1
make[2]: Leaving directory `/usr/local/qt-2.3.2/src'
make[1]: *** [sub-src] Error 2
make[1]: Leaving directory `/usr/local/qt-2.3.2'
make: *** [init] Error 2
这个错误是说,在文件qvaluestack.h的57行出错。改正方法是修改文件qt-2.3.2/ include/qvaluestack.h的 第57行,将remove( this->fromLast() );改为 this->remove( this->fromLast() );
修改时可能要更改文件权限,变成可写的,chmod 666 qvaluestack.h。然后make顺利通过,看到了enjoy。
二、交叉编译 Qt/Embedded 的库
开发居于 Qt/Embedded 的应用程序要使用到 Qt/Embedded 的库,编写的 Qt 嵌入式应用程序最终是在YLE270开发板上运行的,因此在把 Qt 嵌入式应用程序编译成支持 YLE270 的目标代码之前,需要两样东西,一个是 arm9 的 linux 编译器,另一个是经 arm9 的linux 编译器编译过的 Qt/Embedded 的库。安装交叉编译工具 cross-3.3.2 前面已经安装过了。
这一步主要是配置 Qt/Embedded2.3.7 的安装,Qt/Embedded 的安装选项有很多个,您可以在命令行下直接输入“./configure”来运行配置,这时安装程序会一步一步提示你输入安装选项。您也可以在“./configure”后输入多个安装选项直接完成安装的配置。在这些选项中有一个选项决定了编译 Qt/Embedded 库的范围,即可以指定以最小,小,中,大,完全 5 种方式编译 Qt/Embedded 库。另外 Qt/Embedded 的安装选项还允许我们自己定制一个配置文件,来有选择的编译 Qt/Embedded 库,这个安装选项是“-qconfig local” ;当我们指定这个选项时,Qt/Embedded库在安装过程中会寻找qt-2.3.7/src/tools/qconfig-local.h 这个文件,如找到这个文件,就会以该文件里面定义的宏,来编译链接 Qt/Embedded 库。
具体过程如下:
cd qt-2.3.7
export QTDIR=$PWD
export QTEDIR=$QTDIR
make clean
./configure –xplatform linux-arm-g++ -shared –debug (接下行)
-qconfig local -qvfb -depths 4,8,16,32
make
cd ..
在make中出现了错误,有变量没有声明,原来是优龙公司为了避免初学者在一开始就直接接触到 Qt/Embedde 的复杂的宏编译选项,把这些宏定义到一个名为 qconfig-local.h的安装配置文件中,在安装 Qt/Embedded 的时候,需要把这个文件复制到 Qt/Embedded 的安装路径的/src/tools 子路径下,
cp /配置文件所在路径/qconfig-local.h ./src/tools
make顺利通过,看到了enjoy。
最后就可以在命令行下输入make 命令对整个工程进行编译链接了,在这里,要把过程中产生的文件放在同一个文件夹里面,方便应用。
在最后make完毕以后我还是遇到了一个问题,就是生成的可执行文件不能运行,运行时提示:./hello cannot execute binary file,当然不能直接在自己的主机上运行了,因为生成的二进制文件要下到板子上运行的。接上液晶屏,板子上电,把生成的可执行文件下载到板子上,要chmod一下,不然权限不够,终于在液晶屏上看到了自己弄的小程序,好开心!
三、添加一个 Qt/Embedded 应用到 QPE
以hello,world!为例
1 在工作的机器上解包 qtopia
tar zxvf qtopia-free-1.7.x.tar.gz
cd qtopia-free-1.7.x
export QTDIR=$QTEDIR
export QPEDIR=$PWD
export PATH=$QPEDIR/bin:$PATH
注意在上面已经设定环境变量 QPEDIR 为 QPE 的安装(解包)路径。
2 建立 Hello,World 的例子程序的图标文件
方法是:制作一个 32 X 32 大小的 PNG 格式的图标文件,将该文件存放在$QPEDIR/pics/inline 目录下,然后使用以下命令将$QPEDIR/pics/inline 目录下的所有图形文件转换成为一个 c 语言的头文件,这个头文件包含了该目录下的图形文件的 rgb 信息。
qembed --images $QPEDIR/pics/inline/*.*
> $QPEDIR/src/libraries/qtopia/inlinepics_p.h
3 交叉编译 qtopia
在$QPEDIR 路径下,运行以下命令
cd src
./configure –platform linux-arm-g++
make
cd ..
在这一过程中也出现了比较大的错误,在make的时候又出现了error,是resource.cpp的174行的变量qembed_findImage没有声明,考虑到以前遇到的情况,推断可能是少了某个头文件,但是又不知道是哪一个,google了很久都没有找到解决办法,没办法只好点开src/libraries/qtopia下面的每一个头文件看了一遍,还是没有发现有含有这个变量的文件,继续google,然后发现了inlinepics_p.h中包含qembed_findImage,于是vi /usr/local/qtopia-free-1.7.0/src/libraries/qtopia/inlinepics_p.h,发现inlinepics_p.h是空白的,原来是
qembed --images $QPEDIR/pics/inline/*.*
> $QPEDIR/src/libraries/qtopia/inlinepics_p.h
出了错误,重新操作一遍这一步,再查看inlinepics_p.h,发现正常了,要继续交叉编译qtopia:
make clean
./configure –platform linux-arm-g++
C. 小白求助,如何在ubuntu的QT creator下完成交叉编译
你需要先安装嵌入式版本的Qt
以下是我编译Qt时的命令:楼主看着自行改
./configure -prefix /opt/QtEmbedded-4.7.3 -release -shared -fast -pch -no-qt3support -qt-sql-sqlite -no-libtiff -no-libmng -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -no-openssl -nomake examples -nomake demos -nomake tools -optimized-qmake -no-phonon -no-nis -no-opengl -no-cups -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xkb -no-sm -no-xinerama -no-xshape -no-separate-debug-info -xplatform qws/linux-arm-g++ -embedded arm -depths 16 -no-qvfb -qt-gfx-linuxfb -no-gfx-qvfb -no-kbd-qvfb -no-mouse-qvfb -confirm-license -qt-mouse-tslib
然后把生成的Qt的qmake所在的目录加入的Qt creater中,工具链就选你上面的那个arm-linux-g++
然后新建项目的时候就可以选择 Embedded什么来着
这样就搞定了!
D. 怎样交叉编译一个QT应用程序
?
为此我写下我在工作中的一点小经验,希望对曾经像我一样困惑的新手们有点帮助,同时也希望能得到大家的指正,
首先得把我们在X86机上调好的程序进行交叉编译,如果在X86上都没有通过的话。。那就不用交叉编译了,(肯定是通不过的),还是到正题吧,
设置好环境变量,我们用以用echo
来查看环境变量,echo
$TMAKEPATH
,如果返回的不是.../qws/linux-arm-g++
的字符的话,我们一定得从新设置,
export
TMAKEPATH=/tmake
的安装路径/qws/linux-arm-g++
,同时QTDIR一定得要指定QTE的安装路径,设置过程如下:
export
QTDIR=...../qt-2.3.7
以上环境设置好后,我们可以使用tmake来生成Makefile,注意这里我们是用tmake,而不是用qmake(注意),tmake工具在tmake包里面。
具体做法,我们可以在命令行下打:
tmake
-o
Makefile
工程名.pro
这样我们就新生成了一个Makefile文件,下一步,我们要打开这个文件,做一些小的修改
1:
将LINK=arm-linux-gcc
改为:LINK=arm-linux-g++
2:将LIBS=$(SUBLIBS)
-L$(QTDIR)/lib
-lm
-lqte这句话改为:
LIBS=$(SUBLIBS)
-L/opt/gcc-2.3.2-glibc-3.3.2/lib
-L$(QTDIR)/lib
-lm
-lqte
加上你的交叉编译的库。。。最后我们可以make了,一个可以在您的板子上可以运行的二进制文件产生了。
至于怎样加到qtopia上去呢。。。待续。。。。。。。。。。。。。。
E. 如何进行Qt应用程序的交叉编译
首先得把我们在X86机上调好的程序进行交叉编译,如果在X86上都没有通过的话。。那就不用交叉编译了,(肯定是通不过的),还是到正题吧,设置好环境变量,我们用以用echo 来查看环境变量,echo $TMAKEPATH ,如果返回的不是.../qws/linux-arm-g++ 的字符的话,我们一定得从新设置,
export TMAKEPATH=/tmake 的安装路径/qws/linux-arm-g++ ,同时QTDIR一定得要指定QTE的安装路径,设置过程如下:
export QTDIR=...../qt-2.3.7
以上环境设置好后,我们可以使用tmake来生成Makefile,注意这里我们是用tmake,而不是用qmake(注意),tmake工具在tmake包里面。 具体做法,我们可以在命令行下打:
tmake -o Makefile 工程名.pro
这样我们就新生成了一个Makefile文件,下一步,我们要打开这个文件,做一些小的修改
1: 将LINK=arm-linux-gcc 改为:LINK=arm-linux-g++
2:将LIBS=$(SUBLIBS) -L$(QTDIR)/lib -lm -lqte这句话改为:
LIBS=$(SUBLIBS) -L/opt/gcc-2.3.2-glibc-3.3.2/lib -L$(QTDIR)/lib -lm -lqte
加上你的交叉编译的库。
最后我们可以make了,一个可以在您的板子上可以运行的二进制文件产生了。linux
F. 怎样交叉编译QT程序使之能在目标板上运行!
最主要的还是,你的QT在PC上运行的x86的,最后要换成arm结构的,你得怀疑下你的bin是不是真的是arm架构的。
G. 如何进行Qt应用程序的交叉编译
1.设置环境变量: PATH=添加为交叉环境下编译后生成的qmake路径,通常和主机的系统是一种架构,同时需要确保交叉gcc编译器在在PATH定义 QMAKESOEC=交叉编译的对象的的平台描述文件,例如makespec/qws/linux-arm-g++ QTDIR=Qt的安装文件,存放这库和头文件 LD_LIBRARY_PATH=存放的是Qt的交叉编译后的库,准备为目标编译链接的库 2。执行环境变量 通常我们都会将以上的设置放置在一个bash脚本中,需要的时候就执行一下。开始编译 1.使用qmake -project来生成项目文件****.pro 2使用qmake来生成Makefile文件 3使用make来编译移植:使用readeif工具来分析目标系统的以来库,然后相关的库到目标文件系统内。通常我们也是采取脚本的方式来完成。 一般而言,凡是有规律的或者重复性的工作,我们都可以采取脚本的方式来解决。
H. 如何在ubuntu下搭建qt交叉编译环境
第一步,你需要下载QT源代码(4.8的编译比较容易),然后通过 ./configure (参数自己定,不懂看readme)接下来就是在QT CREATE里面配置了,如下:
工具-->选项--->构建和运行
1. 编译器: 点击添加: "名称"随意
"编译器路径" **/arm-none-linux-gnueabi-g++
找到你的编译器,我这里是用ARM的
其他不填也行.
2.Qt Versions: 点击添加:找到通过源码编译好的qmake文件. 例如:/usr/local/Qt-4.8.6/bin/qmake
3.构建套件: 点击添加: "名称"随意, 重点是 "编译器"跟"QT版本", 分别选择刚刚添加的两项.
调试器:如果是桌面环境那就选桌面的, 如果是在嵌入式中的,那不要也可以..
如果是交叉编译,那只能编译,不能运行...
I. 有关QT CREATOR 交叉编译的问题
请先把QtE成功移植到板子上.
然后把QtE的qmake和交叉编译的工具链添加到QtCreator中.
在PC上写完界面后,把项目的编译环境改成QTE再编译一下.把生成的的可执行程序和QTE的lib, nfs或tftp到板子上.然后还要改变环境变量,有几个必须改的环境变量.
export QTDIR=
export QTDEDIR=
export PATH=
export LD_LIBRARY_PAHT=
全部添加指向你的lib.如果你怕麻烦可以把QTE的lib考到/lib目录中.
然后就可以./你的可执行程序了.