limuscle 发表于 2013-3-3 17:20:44

按照天嵌Qt24小时版本,Qt4.5生成了hello_cn不能再开发板运行?问题详述如下。

本帖最后由 limuscle 于 2013-3-4 11:37 编辑

1、编译ARM版本的Qt4.5
./arm_qt4.5_build。以下是脚本的内容,prefix改为/opt/qt-embedded-4.5.3


cd $PWD/qt-embedded-linux-opensource-src-4.5.3

echo yes | ./configure -prefix /opt/qt-embedded-4.5.3 -release -shared -fast -pch -no-qt3support -q
t-sql-sqlite -qt-libtiff -qt-gif -no-libmng -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -no-openssl
-nomake examples -nomake demos -optimized-qmake -no-phonon -no-nis -no-opengl -no-cups -qt-sql-sql
ite -no-separate-debug-info -xplatform qws/linux-arm-g++ -embedded arm -depths 16 -no-qvfb -qt-gfx-
linuxfb -no-gfx-qvfb -qt-kbd-usb -no-kbd-qvfb -no-mouse-qvfb -qt-mouse-tslib -I/tslib/include -L/t
slib/lib

echo "Finished config Qt-embedded-4.5.3"
echo cd $PWD/qt-embedded-linux-opensource-src-4.5.3

make && make install


编译成功并且是成功安装的。

2、建立源码:main.cpp、hello_cn.cpp 和hello_cn.h 这个代码就不贴了。保存在/work/GUI/opt/qt-x11-opensource-src-4.5.3/examples/Limuscle/hello_cn文件夹中
3、在hello_cn文件夹中建立项目脚本。由于是用于arm的。所以
embedded_project.sh:
   $QMAKE -project
   $QMAKE
4、导入arm的环境变量:
qt4.5.3_embedded_setenv.sh:保存在hello_cn目录下
export QPEDIR=/opt/qt-embedded-4.5.3/bin
export QTOPIA_DEPOT_PATH=/opt/qt-embedded-4.5.3/bin
export QTDIR=/opt/qt-embedded-4.5.3/bin
export DQTDIR=/opt/qt-embedded-4.5.3/bin
export QMAKE=/opt/qt-embedded-4.5.3/bin/qmake
export UIC=/opt/qt-embedded-4.5.3/bin/uic
export TMAKEDIR=/opt/qt-embedded-4.5.3/bin
export TMAKEPATH=/opt/qt-embedded-4.5.3/mkspecs/qws/linux-arm-g++
export PATH=$QPEDIR/bin:$QTDIR/bin:$DQTDIR/bin:$TMAKEDIR/bin:$PATH
export LD_LIBRARY_PATH=$QPEDIR/lib:$QTDIR/lib:$DQTDIR/lib:$LD_LIBRARY_PATH
export PATH QTDIR MANPATH LD_LIBRARY_PATH
echo "set qt-embedded-4.5.3 env successful"
echo

以上脚本本来是按照 天嵌提供的setARM_env来的,但是发现原来的TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++这个是没有的,于是修改了,改为export TMAKEPATH=/opt/qt-embedded-4.5.3/mkspecs/qws/linux-arm-g++。这里是不是我搞错了。

5、开始执行。
source qt4.5.3_embedded_setenv.sh
./embedded_project
到这一步可以得到Makefile文件的。
打开Makefile,
CC = gcc
CXX = g++
DEFINES = -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -
DQT_SHARED
CFLAGS = -pipe -g -O2 -Wall -W -D_REENTRANT $(DEFINES)
CXXFLAGS = -pipe -g -O2 -Wall -W -D_REENTRANT $(DEFINES)
INCPATH = -I../../../mkspecs/linux-g++ -I. -I../../../include/QtCore -I../../../include/QtGui
-I../../../include -I. -I.moc/release-shared
LINK = g++
LFLAGS = -Wl,-O1 -Wl,-rpath,/work/GUI/opt/qt-x11-4.5.3/lib -Wl,-rpath,/work/GUI/opt/qt-x11-4.
5.3/lib
以上是一部分,可以看到CC,CXX,LINK是用的是x86上的编译器,不是arm-linux-gcc,arm-linux-g++,
如果使用这个Makefile文件,编译出来的执行文件肯定不可用啦。

执行file hello_cn
hello_cn: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
可以看到是80386机器类型上执行的文件。

问题:为什么不是生成arm-linux-gcc类型的Makefile,究竟哪一步我错了。

还有一个说明一下:就是那个qt4.5.3编译arm版本生成安装/opt/qt-embedded-4.5.3/应该是成功的。因为之前我试第一次hello_cn时是成功生成arm下的执行文件,并且可以在开发板上运行的。




ww110052181 发表于 2013-3-4 07:09:36

{:2_140:}{:2_140:}{:2_140:}{:2_140:}{:2_140:}{:2_140:}

亚瑟王 发表于 2013-3-4 09:55:55

亲,应该用arm版本的qmake工具,而不是用PC自带的qmake工具来生成Makefile文件。

limuscle 发表于 2013-3-4 10:25:49

本帖最后由 limuscle 于 2013-3-4 10:33 编辑

回复楼上:
其实是使用arm版本的qmake的。
因为之前导入了环境变量了,且在embedded_project.sh中是使用$QMAKE的。
limuscle@ubuntu:/work/GUI/opt/qt-embedded-linux-opensource-src-4.5.3/examples/Limuscle/hello_cn$ source qt4.5.3_embedded_setenv.sh
set qt-embedded-4.5.3 env successful

limuscle@ubuntu:/work/GUI/opt/qt-embedded-linux-opensource-src-4.5.3/examples/Limuscle/hello_cn$ echo $QMAKE
/opt/qt-embedded-4.5.3/bin/qmake
limuscle@ubuntu:/work/GUI/opt/qt-embedded-linux-opensource-src-4.5.3/examples/Limuscle/hello_cn$ 以上可以看出是使用了arm版本的qmake的。

我的x86编译的版本目录/work/GUI/opt/qt-x11-opensource-src-4.5.3
arm版本qt4.5.3编译目录:/work/GUI/opt/qt-embedded-linux-opensource-src-4.5.3/
昨天的都是在x86版本目录下进行的。

昨天后,我将工程从x86复制到arm版本目录中。同样执行同样的操作,此时就可以生成arm版本的makefile,生成执行文件可以在开发板中使用。

于是怀疑是不是由于工程放置的路径问题。
想测试可不可以再arm版本编译目录下生成x86的执行文件。
将qt4.5.3_x11_setenv.sh,x11_project.sh 复制到arm编译目录:/work/GUI/opt/qt-embedded-linux-opensource-src-4.5.3/

#!/bin/sh
#qt4.5.3_x11_setenv.sh
export QPEDIR=/work/GUI/opt/qt-x11-4.5.3/bin
export QTOPIA_DEPOT_PATH=/work/GUI/opt/qt-x11-4.5.3/bin
export QTDIR=/work/GUI/opt/qt-x11-4.5.3/bin
export DQTDIR=/work/GUI/opt/qt-x11-4.5.3/bin
export QMAKE=$QTDIR/qmake
export UIC=$QTDIR/uic
export TMAKEDIR=$QTDIR/bin
export TMAKEPATH=/work/GUI/opt/qt-x11-4.5.3/mkspecs/qws/linux-arm-g++
export PATH=$QPEDIR/bin:$QTDIR/bin:$DQTDIR/bin:$TMAKEDIR/bin:$PATH
export LD_LIBRARY_PATH=$QPEDIR/lib:$QTDIR/lib:$DQTDIR/lib:$LD_LIBRARY_PATH
export PATH QTDIR MANPATH LD_LIBRARY_PATH
echo " set qt4.5.3-x11 env successful "
echo
同样也复制x86的项目脚本:x11_project.sh
#!/bin/sh

#set the qmake env varible,need comment at here ,and it execture at command line
#/work/GUI/opt/qt4.5.3_x11_setenv.sh
#use the system qmake
qmake -project
qmake
接着就执行:在arm版本编译目录:/work/GUI/opt/qt-embedded-linux-opensource-src-4.5.3/examples/Limuscle
source qt4.5.3_x11_setenv.sh ; ./x11_project.sh

此时生成了Makefile使用的是arm-linux-gcc 交叉编译器,而不是gcc这个x86编译器。

所以我总结就是编译x86版本的执行文件要放置在x86编译的目录:/work/GUI/opt/qt-x11-opensource-src-4.5.3下。
编译arm版本的执行文件要把工程放置在arm编译的目录:/work/GUI/opt/qt-embedded-linux-opensource-src-4.5.3/下。

这只是目前个人的理解。不知对与错。请指正??

可能有点啰嗦了。




亚瑟王 发表于 2013-3-4 10:32:59

limuscle 发表于 2013-3-4 10:25 static/image/common/back.gif
回复楼上:
其实是使用arm版本的qmake的。
因为之前导入了环境变量了,且在embedded_project.sh中是使用$ ...

第一个脚本你是想用于arm吗?他的路径都应该用arm的qt的路径才对。

limuscle 发表于 2013-3-4 10:37:46

是啊,现在我也是这样认为了。想用于arm的,要把工程放置在arm的qt路径上。想用于x86的,要把工程放置在x86的qt路径上。
此前错误认为只要改变当前的环境变量,就可以在x86的qt上生成用于arm的执行文件。

亚瑟王 发表于 2013-3-4 10:38:40

limuscle 发表于 2013-3-4 10:37 static/image/common/back.gif
是啊,现在我也是这样认为了。想用于arm的,要把工程放置在arm的qt路径上。想用于x86的,要把工程放置在x86 ...

是的,要区分的。

limuscle 发表于 2013-3-4 10:49:32

谢谢了。{:2_148:}

亚瑟王 发表于 2013-3-4 11:12:34

limuscle 发表于 2013-3-4 10:49 static/image/common/back.gif
谢谢了。

亲,问题解决了,请修改帖子类型为“已解决”(请参考:http://www.armbbs.net/forum.php?mod=viewthread&tid=15200)
页: [1]
查看完整版本: 按照天嵌Qt24小时版本,Qt4.5生成了hello_cn不能再开发板运行?问题详述如下。