本文主要是介绍Fedora12下搭建Qt Creator的ARM开发环境 并 移植Qt4.6.2到Micro2440,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Fedora12下搭建Qt Creator的ARM开发环境 并 移植Qt4.6.2到Micro2440参考:
http://hi.baidu.com/jiyeqian/blog/item/f46d26a2ff3f7da6caefd0d6.html
http://blog.csdn.net/dongliqiang2006/archive/2009/08/30/4500002.aspx
环境:虚拟机Fedora12(建议安装Vmware Tools,详细安装方法参照Vmware帮助文档),USB串口,minicom终端。(minicom经常打不开ttyUSB0设备,我的解决方法是,打不开时就将USB串口移除,运行minicom,然后再接上USB串口,此时运行minicom一般都能打开设备)
软件准备:
到http://qt.nokia.com/downloads-cn下载最新版的软件包,当前是:
用于 Linux/X11 32位 的 Qt Creator 1.3.1 二进制软件包qt-creator-linux-x86-opensource-1.3.1.bin(http://qt.nokia.com/downloads/qt-creator-binary-for-linux-x11-32-bit)
用于嵌入式 Linux 的 Qt 库 4.6.2包qt-everywhere-opensource-src-4.6.2.tar.gz(http://qt.nokia.com/downloads/embedded-linux-cpp)
下载tslib1.4,这个忘了在哪下载的了,网上有很多,有些不能用,大家自己找个能用的吧。
*以下安装方法主要来自文章http://hi.baidu.com/jiyeqian/blog/item/f46d26a2ff3f7da6caefd0d6.html
将 qt-everywhere-opensource-src-4.6.2.tar.gz 压缩包解压为3份,分别编译 PC ,嵌入式 x86 和 arm 三个版本。
我在root目录下建立tmp文件夹,将qt-everywhere-opensource-src-4.6.2.tar.gz直接解压后复制2分,分别命名为pc、x86、arm。
1. 编译 PC 版: ///估计是虚拟平台上用的
{
进入pc目录
#./configure
# gmake
# gmake install
安装过程比较长,没有碰到过错误。
}
2. 编译嵌入式x86版 ///x86平台,可能是真实的,可以运行在所有的x86平台上的,.试试看
{
进入x86目录
# ./configure -embedded x86 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb
# gmake
# gmake install
安装过程比较长,没有碰到过错误。
编译安装PC版中的 qvfb:
进入pc/tools/qvfb/目录
#make
编译完毕,将pc/bin目录下的qvfb文件复制到/usr/local/Trolltech/QtEmbedded-4.6.2/bin目录。
}
3. 编译嵌入式arm版(需要 arm-linux-gcc 的支持):
{使用友善自带的ARM-Linux GCC 4.3.2编译完了,程序移植到开发板上后,出现Segmentation Fault错误,按原文,使用4.1.2正常。
直接将arm920t-eabi.tgz解压缩到根目录,不可以像文章中说的那样“我把它放在:/usr/local/arm/4.1.2/ ”,最起码我放过去后出错了。
把编译器路径加入系统环境变量,运行命令:
#gedit /root/.bashrc
编辑/root/.bashrc文件,在最后一行加上 export PATH=/opt/toolchains/arm920t-eabi/bin:$PATH
编译tslib对触摸屏支持:
下载,tslib1.4.tar.gz,解压后:
# ./configure --prefix=/usr/local/tslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
# make
# make install
我下载的包解压后没有configure文件,需要运行autogen.sh后才能生成。
设置环境变量,以便编译时找到相关的库:
# export CPLUS_INCLUDE_PATH=/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/include/c++:/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/include/c++/arm-none-linux-gnueabi
# export PATH=/opt/toolchains/arm920t-eabi/bin:$PATH
修改qt-everywhere-opensource-src-4.6.2/mkspecs/qws/linux-arm-g++/qmake.conf 文件(添加lts参数):
QMAKE_CC = arm-linux-gcc -lts
QMAKE_CXX = arm-linux-g++ -lts
QMAKE_LINK = arm-linux-g++ -lts
QMAKE_LINK_SHLIB = arm-linux-g++ -lts
这一步必须有,不然肯定出错。
配置:
必须加上“-prefix /usr/local/Trolltech/QtEmbedded-4.6.2-arm ”参数, 不然安装后不在QtEmbedded-4.6.2-arm文件夹下,而是覆盖了QtEmbedded-4.6.2。
# ./configure \
-prefix /usr/local/Trolltech/QtEmbedded-4.6.2-arm \
-opensource \
-confirm-license \
-release -shared \
-embedded arm \
-xplatform qws/linux-arm-g++ \
-depths 16,18,24 \
-fast \
-optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-libjpeg \
-qt-zlib \
-qt-libpng \
-qt-freetype \
-little-endian -host-little-endian \
-no-qt3support \
-no-libtiff -no-libmng \
-no-opengl \
-no-mmx -no-sse -no-sse2 \
-no-3dnow \
-no-openssl \
-no-webkit \
-no-qvfb \
-no-phonon \
-no-nis \
-no-opengl \
-no-cups \
-no-glib \
-no-xcursor -no-xfixes -no-xrandr -no-xrender \
-no-separate-debug-info \
-nomake examples -nomake tools -nomake docs \
-qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib
上面划掉的蓝色内容,可以不要的,这样编辑也不会出错(虚拟机搞坏了,不得已重装,配置参数时忘了干上面的工作了,结果发现没出错)。
关于配置参数,参照一下这篇文章吧,可以用configure -embedded –help查看。
http://www.cuteqt.com/blog/?p=582
如果你放弃配置,则使用命令:# gmake confclean
编译:# gmake
安装:# gmake install
安装完成后,在 /usr/local/Trolltech 目录中有三个文件夹:Qt-4.6.2、QtEmbedded-4.6.2、QtEmbedded-4.6.2-arm。
}
4、移植
我是通过NFS启动的系统,具体操作可以参照友善的手册,在http://www.arm9.net/download.asp有下载,在第5.5.3节通过NFS启动系统。
将Fedora12上 /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib 中的所有文件复制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib目录中(对应目录复制,相当于复制到了开发板对应目录中),其实需要的时候可以裁剪,看原文吧。
将Fedora12上 /usr/local/tslib 中的库复制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local中。即将/usr/local/tslib下的所有文件复制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local文件夹下。
如果运行时还缺少其他的库,复制方法相同。也可以使用arm-angstrom-linux-gnueabi-readelf -a 程序名 | grep "Share",命令查看需要哪些共享库,一起复制过去。
为支持触摸屏,开机自动设置环境变量,在2440的 /etc/profile中追加:
export LD_LIBRARY_PATH=/usr/local/lib:$QTDIR/lib:$LD_LIBRARY_PATH
export TSLIB_ROOT=/usr/local/lib
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_PLUGINDIR=/usr/local/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CONFFILE=/usr/local/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
取消/usr/local/etc/ts.conf中的第一个注释:
# module_raw input (去掉#,并且该行顶格)
我编辑时没有“#”
启动Micro2440运行 /usr/local/bin/ts_calibrate 校正触摸屏。
到此Qt4.6.2的移植暂告一段落,移植还没有完,此时如果在开发板上运行Qt4.6.2-arm编译的程序,则会出现“relocation error: /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtGui.so.4: symbol powf, version GLIBCXX_3.4 not defined in file libstdc++.so.6 with link time reference”错误。
5、安装Qt-creator-1.3.1
把下载的qt-creator-linux-x86-opensource-1.3.1.bin文件拷到一个目录(如前面的/root/tmp目录),进入目录:
设置qt-creator-linux-x86-opensource-1.3.1.bin文件为可执行
#chmod +x qt-creator-linux-x86-opensource-1.3.1.bin
安装:
# ./ qt-creator-linux-x86-opensource-1.3.1.bin
启动安装界面,默认一路Next即可。
*如果我们下载的是Qt的SDK(qt-sdk-linux-x86-opensource-2010.02.bin),这里可以选择安装Qt的开发环境,这样,在前面安装pc版Qt那步就可以省了,关键是可以省出很多时间的。
6、Qt-creator开发环境的配置
启动Qt-creator。
在Qt-creator菜单栏Tools—〉Options…打开Options窗口。
在Options界面左侧,点击Qt4—〉Qt Versions右侧显示Qt Versions设置界面。
在Qt Versions界面中点击那个蓝色的大“╋”号图标
在下方Version Name:文本框内输入Qt的版本名,可以随便填,能区分各个版本即可(如pc版取Qt4.6.2-pc、x86版取QtE4.6.2-x86、arm版取QtE4.6.2-arm)。
单击Qmake Location:右侧Browse…按钮,在弹出的“Select QMake Executable”窗口中找到对应版本的qmake程序(按照我们前面安转的,pc版路径:/usr/local/Trolltech/Qt-4.6.2/bin/qmake;x86版路径:/usr/local/Trolltech/QtEmbedded-4.6.2/bin/qmake;arm版路径:/usr/local/Trolltech/QtEmbedded-4.6.2-arm/bin/qmake),单击打开,回到Qt Versions界面。
回到Qt Versions界面,单击Debugging Helper:右侧Rebuild按钮,等待片刻,看到Debugging Helper:后出现一个绿色的“√”即可。
同理完成其他版本的添加。
添加完毕,单击OK按钮关闭Options窗口。
到此,Qt-creator配置完毕(我暂时就配置了这些)。
7、一个例子
从usr/local/Trolltech/QtEmbedded-4.6.2/demos下复制books例程到root/tmp文件夹下。
启动Qt-creator,File—〉Open File or Project…,打开root/tmp/books/books.pro。
这里我们分两部分,首先编译x86下的,并运行在qvfb下,再编译arm下的,移到开发板下运行。
7.1、x86下的编译与调试
在Qt-creator界面左侧点击Projects图标,打开工程设置界面。
从上往下,
在Edit Project Settings for Project books——〉Build Settings——〉Edit Build Configuration:单击Add,在下拉列表中选择Using Qt Version “QtE4.6.2-x86”弹出对话框单击Ok按钮,在Edit Build Configuration:下会出现蓝色的Make QtE4.6.3-x86 Release active.字符,单击激活QtE4.6.3-x86 Release。
在Run Settings——〉Edit run configuration:右侧单击Show Details按钮,在打开的下拉列表中Arguments:文本框中添加参数“-qws”。
设置完毕,点击Edit图标,回到编辑界面。
编译:在Build菜单下,先Clean Project “books”,然后Build Project “books”,在右下角Compile Output窗口能看到编译信息(按我们上面这样走来,到此编译不会出问题的)。
运行:
启动终端,# /usr/local/Trolltech/QtEmbedded-4.6.2/bin/qvfb -width 800 -height 480 &,启动Qvfb。
回到Qt-creator,Build——〉Run,运行程序。
切换我们的Qvfb窗口中,是不是看到Books运行的界面了。
调试:Debug——〉Start Debugging——〉Start Debugging,即可启动调试(请保证books路径中没有中文名,即不要把books工程放在了某个含有中文字符的文件夹下,不然无法启动调试)。
此时感觉如果前面编译选项Edit Project Settings for Project books——〉Build Settings——〉Edit Build Configuration:选择Debug项,则调试启动速度比Release时的要快很多。
7.2、arm编译并移植
编译:在Projects设置界面下,选择Using Qt Version “QtE4.6.2-arm”项,余下参数不变,build。
复制编译好的文件(也许还有images文件夹)到2440的NFS文件系统的某个目录下,我直接把books文件夹复制过去了(在Fedora12 文件系统下是/opt/FriendlyARM/mini2440/root_qtopia/home/plg文件夹下)。
运行及错误处理:
在minicom下面,ps一下,找到qpe进程对应的PID,比如1234,然后通过kill 1234杀死Qtopia。
进入books目录,执行./books –qws,此时就会出现前面讲到的“relocation error: /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtGui.so.4: symbol powf, version GLIBCXX_3.4 not defined in file libstdc++.so.6 with link time reference”错误。
我的解决办法是进入主机/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/lib目录下找到libstdc++.so.6链接的文件libstdc++.so.6.0.8(通过右键属性——〉基本,可以看到链接的文件),复制并重命名为libstdc++.so.6到/opt/FriendlyARM/mini2440/root_qtopia/lib文件夹下,之前别忘了将该文件夹下的libstdc++.so.6移到其它地方或重命名,如libstdc++.so.6.old。
*重命名其实是比较野蛮的方法,可以用ln命令的,参照下面这篇文章……
http://hi.baidu.com/a263238386/blog/item/362f01ce7b11a10a93457eae.html
然后再运行./books –qws,看问题是不是解决了!
这里有个新的问题还没解决,就是在开发版上运行时字非常小,留着以后处理吧。
OK!至此,Fedora12下搭建Qt Creator的ARM开发环境 并 移植Qt4.6.2到Micro2440算告一段落了,留下两个问题:字体非常小的问题、开发板上的远程调试,留待下次解决。
1 加载USB摄像头驱动程序
Linux下自带有ov511控制芯片的USB摄像头驱动,但是我们使用的是中星微的摄像头,所以无法直接使用。目前Linux下的开源USB摄像头驱动spca5xx支持中星微的摄像头。在网上下载好源码,交叉编译成内核模块后使用insmod命令加载到系统中去。把摄像头连接到开发板上,发现可以识别到摄像头,下面我们就可以进行摄像头图像采集编程了。
2 Linux下的视频采集编程接口简介
Linux对于视频采集设备的支持,是通过Video For Linux实现的,通常可以简称为V4L,现在较高版本的Linux内核都已经包含了Video For Linux。Video For Linux是为各种电视卡,以及并口和USB接口的音视频采集设备提供统一的编程接口,在Linux 下,视频采集设备的正常使用依赖于对Video For Linux标准的支持。
3 基于Video For Linux的图片捕捉
基于Video For Linux的图片捕捉流程如图所示,主要包括三个部分:初始化,同步,读取数据。
命令“
rpm -Uvh libusb-0.1.8-2.1.i386.rp
由于友善之臂太吊了,触屏幕驱动已经完美搞定,而且光盘里还有Arm-linux-gcc 4.3.2,省了我不少事
这次移植很顺利
先移植tslib
解压之后,执行./autogen.sh
生成configure
然后
echo ac_cv_func_malloc_0_nonnull=yes>arm-linux.cache
这句很重要,大意是不使用malloc之类的,如果没有这个,极其有可能出错
最后
./configure --host=arm-linux --prefix=/opt/ts
接下来是QT
QT的configure参数
./configure \
-prefix /qtlib/ \
-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 \
-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\
-qt-kbd-usb \
-confirm-license \
-qt-mouse-tslib -I/opt/ts/include -L/opt/ts/lib
最后一句定义使用tslib作为鼠标驱动,-I和-L指定tslib的include文件和lib文件位置
为了节省时间,很多地方都nomake了
搞定,nfs到开发板上,再设置一下环境变量
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CONFFILE=/opt/ts/etc/ts.conf
export TSLIB_PLUGINDIR=/opt/ts/lib
export TSLIB_CALIBFILE=/etc/pointercal
export QTDIR=/opt/qt4
export QPEDIR=/opt/qt4
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH
export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
最后一句比较重要,大概是指定QWS的鼠标类型,即指定使用tslib,如果没有设置这个,QWS则不会对触屏有响应
运行demo里面的mousecalibration,完美成功~~~
接下来开始学一下QWebView的使用,写个简易浏览器试试看
(原文件名:video.jpg)
引用图片
图片捕捉流程见上图,主要包括3个步骤:
1)初始化:首先是使用open函数打开视频设备文件,而且是独占的可读模式。然后使用Video For Linux接口函数设置视频设备的数据通道,设置视频数据传输的模式,可选的有NSTC或者PAL等。为了方便读取图像数据,使用mmap函数建立内存映射,在应用程序中直接读取图像数据。最后就是设置要捕捉的图片大小,即分辨率,我使用的摄像头最大可以提供分辨率800*600,每秒25张图片。
2)同步:等待一帧视频数据采集完毕后才能读取数据,否则将出现错误,同时还可以对帧号进行操作。
3)读取数据:我们使用的中星微摄像头传输过来的图片已经是JPEG编码格式。
下图就是使用Video For Linux采集的320*240的jpeg格式图片。
http://blog.simophin.net/?p=559
在mini2440上移植qt embedded for linux 4.5.2
作者:孙晓明,华清远见嵌入式学院讲师。
【实验环境】
1、主 机:Fedora9 DVD 发行版
2、目标机:mini2440友善之臂
3、源码包:
ftp://ftp.qtsoftware.com/qt/source/qt-embedded-linux-opensource-src-4.5.2.tar.gz
4、编译器 arm-linux-gcc-4.1.2
http://qtextended.org/downloads/toolchains/arm920t-eabi.tgz
我这几天移植qt-embedded-linux-opensource-src-4.5.2 因为之前使用友善的 arm-linux-gcc-4.3.2编译qt-embedded-linux-opensource-src-4.5.2 没有错误,但是运行 例子程序example/widget/analogclock/analogclock -qws & 就会出段错误, 所有改用 openmoko的arm-linux-gcc-4.1.2编译, 最后可以成功看到界面。
移植的tslib1.4 在,并且运行ts_calibrate 五点校准,触摸屏是有反应的,并能生成/etc/pointercal
ts_test 也是好使的,拖拽都没有问题。 但是就是运行移植的 QTE的程序 触摸屏一点反应也没有。 顺便说一下,内核还是用的mini2440出厂时nand里的linux-2.6.29,没有动过,触摸屏已经是被内核支持了。
这是我配置的环境变量:
以下环境变量都是我在终端敲入的
export QTDIR=/usr/local/QtEmbedded-4.5.2-moko-arm
export QPEDIR=/usr/local/QtEmbedded-4.5.2-moko-arm
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH
export TSLIB_ROOT=/usr/local/tslib
export TSLIB_TSDEVICE=/dev/event0
export LD_LIBRARY_PATH=/usr/local/tslib/lib:$LD_LIBRARY_PATH
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_PLUGINDIR=/usr/local/tslib/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CONFFILE=/usr/local/tslib/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_MOUSE_PROTO=Tslib:/dev/event
这是我安装tslib1.4的步骤:
一、tslib移植
第一步:解压tslib-1.4.tar.gz
tar -zxvf tslib-1.4.tar.gz
第二步:进入解压过的目录
cd tslib-1.4
第三步:执行tslib-1.4目录下的autogen.sh
./autogen.sh
第四步:执行autogen.sh脚本所生成的Makefile文件
在命令行打入以下命令:
echo "ac_cv_func_malloc_0_nonnull=yes" >$ARCH-linux.cache
./configure --host=arm-linux --prefix=/usr/local/tslib --cache-file=$ARCH-linux.cache
第五步:
make
make install
第六步:把指定安装目录下的tslib的文件都copy到你所挂载的根文件下
sudo cp -a /home/linux/tslib/* /opt/FriendlyARM/mini2440/root_qtopia/usr/local/tslib/
第七步:修改/opt/FriendlyARM/mini2440/root_qtopia/usr/local/tslib/ 下的etc目录中ts.conf文件
vi ts.conf 将第二行的#module_raw input修改成module_raw input 注意一定要顶格写否则程序执行时会发生读取ts.conf错误
Fedora12下搭建Qt Creator的ARM开发环境 并 移植Qt4.6.2到Micro2440(一)
10-04-29 12:20 发表于:《南京嵌入式开发圈》 分类:未分类
环境:虚拟机Fedora12(建议安装Vmware Tools,详细安装方法参照Vmware帮助文档),USB串口,minicom终端。(minicom经常打不开ttyUSB0设备,我的解决方法是,打不开时就将USB串口移除,运行minicom,然后再接上USB串口,此时运行minicom一般都能打开设备)
软件准备:
到http://qt.nokia.com/downloads-cn下载最新版的软件包,当前是:
用于 Linux/X11 32位 的 Qt Creator 1.3.1 二进制软件包qt-creator-linux-x86-opensource-1.3.1.bin(http://qt.nokia.com/downloads/qt-creator-binary-for-linux-x11-32-bit)
用于嵌入式 Linux 的 Qt 库 4.6.2包qt-everywhere-opensource-src-4.6.2.tar.gz(http://qt.nokia.com/downloads/embedded-linux-cpp)
到http://hi.baidu.com/jiyeqian/blog/item/f46d26a2ff3f7da6caefd0d6.html下载arm920t-eabi.tgz(即arm-linux-gcc-4.1.2)(http://qtextended.org/downloads/toolchains/arm920t-eabi.tgz)
到http://www.arm9.net/download.asp下载Root_Qtopia,我用的是友善光盘里的root_qtopia-20100108.tar.gz(http://www.arm123.com.cn/linux/root_qtopia-20100108.tar.gz)
下载tslib1.4,这个忘了在哪下载的了,网上有很多,有些不能用,大家自己找个能用的吧。
*以下安装方法主要来自文章http://hi.baidu.com/jiyeqian/blog/item/f46d26a2ff3f7da6caefd0d6.html
将 qt-everywhere-opensource-src-4.6.2.tar.gz 压缩包解压为3份,分别编译 PC ,嵌入式 x86 和 arm 三个版本。
我在root目录下建立tmp文件夹,将qt-everywhere-opensource-src-4.6.2.tar.gz直接解压后复制2分,分别命名为pc、x86、arm。
1. 编译 PC 版:
进入pc目录
#./configure
# gmake
# gmake install
安装过程比较长,没有碰到过错误。
2. 编译嵌入式x86版:
进入x86目录
# ./configure -embedded x86 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb
# gmake
# gmake install
安装过程比较长,没有碰到过错误。
编译安装PC版中的 qvfb:
进入pc/tools/qvfb/目录
#make
编译完毕,将pc/bin目录下的qvfb文件复制到/usr/local/Trolltech/QtEmbedded-4.6.2/bin目录。
3. 编译嵌入式arm版(需要 arm-linux-gcc 的支持):
使用友善自带的ARM-Linux GCC 4.3.2编译完了,程序移植到开发板上后,出现Segmentation Fault错误,按原文,使用4.1.2正常。
直接将arm920t-eabi.tgz解压缩到根目录,不可以像文章中说的那样“我把它放在:/usr/local/arm/4.1.2/ ”,最起码我放过去后出错了。
把编译器路径加入系统环境变量,运行命令:
#gedit /root/.bashrc
编辑/root/.bashrc文件,在最后一行加上 export PATH=/opt/toolchains/arm920t-eabi/bin:$PATH
编译tslib对触摸屏支持:
下载,tslib1.4.tar.gz,解压后:
# ./configure --prefix=/usr/local/tslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
# make
# make install
我下载的包解压后没有configure文件,需要运行autogen.sh后才能生成。
设置环境变量,以便编译时找到相关的库:
# export CPLUS_INCLUDE_PATH=/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/include/c++:/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/include/c++/arm-none-linux-gnueabi
# export PATH=/opt/toolchains/arm920t-eabi/bin:$PATH
修改qt-everywhere-opensource-src-4.6.2/mkspecs/qws/linux-arm-g++/qmake.conf 文件(添加lts参数):
QMAKE_CC = arm-linux-gcc -lts
QMAKE_CXX = arm-linux-g++ -lts
QMAKE_LINK = arm-linux-g++ -lts
QMAKE_LINK_SHLIB = arm-linux-g++ -lts
这一步必须有,不然肯定出错。
配置:
必须加上“-prefix /usr/local/Trolltech/QtEmbedded-4.6.2-arm ”参数, 不然安装后不在QtEmbedded-4.6.2-arm文件夹下,而是覆盖了QtEmbedded-4.6.2。
# ./configure \
-prefix /usr/local/Trolltech/QtEmbedded-4.6.2-arm \
-opensource \
-confirm-license \
-release -shared \
-embedded arm \
-xplatform qws/linux-arm-g++ \
-depths 16,18,24 \
-fast \
-optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-libjpeg \
-qt-zlib \
-qt-libpng \
-qt-freetype \
-little-endian -host-little-endian \
-no-qt3support \
-no-libtiff -no-libmng \
-no-opengl \
-no-mmx -no-sse -no-sse2 \
-no-3dnow \
-no-openssl \
-no-webkit \
-no-qvfb \
-no-phonon \
-no-nis \
-no-opengl \
-no-cups \
-no-glib \
-no-xcursor -no-xfixes -no-xrandr -no-xrender \
-no-separate-debug-info \
-nomake examples -nomake tools -nomake docs \
-qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib
上面划掉的蓝色内容,可以不要的,这样编辑也不会出错(虚拟机搞坏了,不得已重装,配置参数时忘了干上面的工作了,结果发现没出错)。
关于配置参数,参照一下这篇文章吧,可以用configure -embedded –help查看。
http://www.cuteqt.com/blog/?p=582
如果你放弃配置,则使用命令:# gmake confclean
编译:# gmake
安装:# gmake install
安装完成后,在 /usr/local/Trolltech 目录中有三个文件夹:Qt-4.6.2、QtEmbedded-4.6.2、QtEmbedded-4.6.2-arm。
4、移植
我是通过NFS启动的系统,具体操作可以参照友善的手册,在http://www.arm9.net/download.asp有下载,在第5.5.3节通过NFS启动系统。
将Fedora12上 /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib 中的所有文件复制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib目录中(对应目录复制,相当于复制到了开发板对应目录中),其实需要的时候可以裁剪,看原文吧。
将Fedora12上 /usr/local/tslib 中的库复制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local中。即将/usr/local/tslib下的所有文件复制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local文件夹下。
如果运行时还缺少其他的库,复制方法相同。也可以使用arm-angstrom-linux-gnueabi-readelf -a 程序名 | grep "Share",命令查看需要哪些共享库,一起复制过去。
为支持触摸屏,开机自动设置环境变量,在2440的 /etc/profile中追加:
export LD_LIBRARY_PATH=/usr/local/lib:$QTDIR/lib:$LD_LIBRARY_PATH
export TSLIB_ROOT=/usr/local/lib
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_PLUGINDIR=/usr/local/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CONFFILE=/usr/local/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
取消/usr/local/etc/ts.conf中的第一个注释:
# module_raw input (去掉#,并且该行顶格)
我编辑时没有“#”
启动Micro2440运行 /usr/local/bin/ts_calibrate 校正触摸屏。
到此Qt4.6.2的移植暂告一段落,移植还没有完,此时如果在开发板上运行Qt4.6.2-arm编译的程序,则会出现“relocation error: /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtGui.so.4: symbol powf, version GLIBCXX_3.4 not defined in file libstdc++.so.6 with link time reference”错误。
编译QT4-embedded-4.4.3
# tar jxvf qt-embedded-linux-opensource-src-4.4.0.tar.bz2
# mv qt-embedded-linux-opensource-src-4.4.0 qt-embedded-linux-opensource-src-4.4.0-arm
# cd qt-embedded-linux-opensource-src-4.4.0-arm
#./configure -prefix /usr/local/Trolltech/QtEmbedded-4.6.3-arm –opensource -confirm-license -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 -qt-kbd-usb -confirm-license -qt-mouse-tslib -qconfig nocursor -I/home/tslib-1.3/build/include -L/home/tslib-1.3/build/lib
参考““./configure -prefix /usr/local/Trolltech/QtEmbedded-4.6.2-arm -opensource -confirm-license -release -shared -embedded arm -xplatform qws/linux-arm-g++ -depths 16,18,24 -fast -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -little-endian -host-little-endian -no-qt3support -no-libtiff -no-libmng -no-opengl -no-mmx -no-sse -no-sse2 -no-3dnow -no-openssl -no-webkit -no-qvfb -no-phonon -no-nis -no-opengl -no-cups -no-glib -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-separate-debug-info -nomake examples -nomake tools -nomake docs -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib“
其中-prefix /home/qt4arm 是你要安装的路径。-I/home/tslib-1.3/build/include -L/home/tslib-1.3/build/lib是你刚才编译好的tslib-1.3的两个文件夹路径。
几分钟后配置完毕
# make && make install
一共需要一个半小时(虚拟机下编译,本机配置为1G内存,AMD1.8G单核CPU)。
把所需要的库拷贝到开发板的相应的目录即可,最好和prefix参数的目录一致,像我的就是拷贝到/home/qt4arm/lib下,当然有的库你可以不需要拷贝的,运行程序提示缺啥就拷贝啥。
然后拷贝显示中文的文泉驿字体wenquanyi_160_75.qpf 到/home/qt4arm/lib/font下。
最后拷贝tslib-1.3下build文件夹到开发板相应地方。
3,设置坏境变量
export QTDIR=/home/qt4arm
export PATH=$QTDIR/bin:$PATH
export QWS_DISPLAY=LinuxFb:/dev/fb0
export QWS_SIZE=640x480
export QWS_SW_CURSOR=1
export QWS_MOUSE_PROTO=Tslib:/dev/event0
export QWS_KEYBOARD=TTY:/dev/tty0
export QT_ONSCREEN_PAINT=0
export PONTERCAL_FILE=/etc/pointercal
export LD_LIBRARY_PATH=$QTDIR/lib:/lib:/usr/lib:$LD_LIBRARY_PATH
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=/dev/tty
export TSLIB_FBDEVICE=/dev/fb0
mini2440 qt4 移植(转+自己添加)
LInux环境搭建与设置 2009-04-24 10:06:49 阅读1974 评论5 字号:大中小
由于mini2440的光盘里自带一个root_default.tgz根文件,因此省了很大一部分力气自己去裁剪,但是也有很大的缺陷就是:本身就对内核不熟悉,现在跳过了这一步,就更加不理解了。以后还是要补上来。
我做的时候现在fc8下试过,第一次是配置的时候“The tslib functionality test failed!”错误
但是不明白原因的,我是按照下面的配置来的还是出问题了。
去掉后根据./configure -h 的提示配置完成,gmake到某处时,错误中断。试了几次都是这样
也许是我的fc8并非完全安装吧。最后换到了亲爱的RH9.0下,按照下面的指示编译成功。不过还有个现象就是在fc8下安装qt-x11可以成功,RH9.0下安装qt-x11就失败了。可能是GCC版本的问题了。在RH9.0下我用的是tslib-1.3
1.编译tslib-1.4 (这部分很好ts-lib的编译还算顺利了)
解压到/home下
#./autogen.sh
#./configure --prefix=/home/duancp/mytslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes (可以先生成个cache文件)
#make
#make install-strip //生成瘦身应用程序和库
2.安装arm-linux-gcc-3.4.1.tar.bz2
在根目录下解压,解压后的默认目录在/usr/local/arm/3.4.1
设置环境变量,运行命令:
vi /etc/profile
加入 export PATH=/usr/local/arm/3.4.1/bin:$PATH
3.编译qt-embedded-linux-opensource-src-4.4.3.tar.gz
tar zxf qt-embedded-linux-opensource-src-4.4.3.tar.gz
cd qt-embedded-linux-opensource-src-4.4.3
(我的QT的安装目录设置为根目录下的/minin2440)
./configure -prefix /mini2440 -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 -qt-kbd-usb -confirm-license -qt-mouse-tslib -I/home/duancp/mytslib/include -L/home/duancp/mytslib/lib
上面的红色部分必须让找前面的tslib的目录设置,否则会出现“The tslib functionality test failed!”错误
./make
make install
cd example/qws/mousecalibtration
qmake &&make (生成mousecalibtration可执行文件,后面需要将其拷贝到根文件中)
(这一步实现时有问题,可能是环境变量没设置好)
4.制作根文件
我的工作目录是在根文件下,首先将root_default.tgz拷贝到根目录下,加压,生成root_default
cd /root/root_default
mkdir tslib
cd tslib
为了方便,将编译的tslib下的bin、etc、lib文件夹全部拷贝过来 (拷贝tslib支持库,我自己的理解了)
cp -a /home/duancp/mytslib/lib ./
cp -a /home/duancp/mytslib/bin ./
cp -a /home/duancp/mytslib/etc ./
cd etc
vi ts.conf (据说是ts.conf的大小有限制,所以必须裁剪,是具体情况而裁剪)
将里面的第二条语句(#module_raw inout)前面的“#”去掉,否则后面触摸屏将不能使用
cd ..
mkdir mini2440 (这里将mini2440作为了qpe目录,实现GUI程序)
cd mini2440
因为我的flash有64M,为了方便,将QT4.4.3的lib文件夹全部拷贝过来,但是要删除fonts内除了wenquanyi_120_50.qpf 之外的其他文件,否则太大
cp -a /mini2440/lib ./
rm -rf fonts
mkdir fonts
cp -a /mini2440/lib/fonts/wenquanyi_120_50.qpf fonts
将前面编译的QT的触摸屏自带程序拷贝过来
cp -a /*/example/qws/mousecalibtration/mousecalibtration ./
cd /root
解压mkyaffsimage.tgz,得到mkyaffsimage可执行文件
./mkyaffsimage root_default root.yaff2
得到根文件root.yaff2,如果要看一下大小,可以执行
ll root.yaff2 -h
这样可以将root.yaff2烧到板子上去了。
在板子上运行mousecalibtration的时候没有出现什么错误,可以正确的显示输入的汉字
目前在板子上运行的时候存在一定的问题:进入tslib运行ts_calibrate,总是提示ts_open: No such file or directory,这个问题一直没有解决,留在后面解决。
在板子上运行的时候环境变量如下: (设置环境变量)
export QTDIR=/mini2440
export LD_LIBRARY_PATH=$QTDIR/lib:$OPIEDIR/lib
export PATH=$QTDIR/lib:$OPIEDIR/bin:$PATH
export QWS_MOUSE_PROTO=tslib:/dev/input/event0
export TSLIB_ROOT=/tslib
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CONFFILE=/tslib/etc/ts.conf
export TSLIB_FBDEVICE='/dev/fb0'
export QWS_KEYBOARD='LIRC:/dev/lircd'
将上面的配置写成个脚本文件,开机时在初始化中开启就行了。
或者直接写到/etc/profile 里面就可以实现开机启动设置变量了。
要是在板子上运行的时候提示缺少某些文件的时候,就去在PC机上的linux下寻找,需要主要的是看若是提示缺少的文件是以个链接文件时,需要把链接对象也拷入
我在运行的时候缺少一个librt.so.1(具体记不得了,好像是这个)的文件,我的办法是把/usr/local/arm/3.4.1/arm-linux/lib下的该文件和其链接对象拷贝过来放在板子里的lib中,就ok了!
QTE4.5.2 移植成功,但群创7寸屏无响应 (已解决)
已解决
我这几天移植qt-embedded-linux-opensource-src-4.5.2
因为之前使用友善的 arm-linux-gcc-4.3.2编译qt-embedded-linux-opensource-src-4.5.2 没有错误,但是运行
例子程序example/widget/analogclock/analogclock -qws & 就会出段错误, 所有改用 openmoko的arm-linux-gcc-4.1.2编译,
最后可以成功看到界面。
移植的tslib1.4 在,并且运行ts_calibrate 五点校准,触摸屏是有反应的,并能生成/etc/pointercal
ts_test 也是好使的,拖拽都没有问题。
但是就是运行移植的 QTE的程序 触摸屏一点反应也没有。
顺便说一下,内核还是用的mini2440出厂时nand里的linux-2.6.29,没有动过,触摸屏已经是被内核支持了。
这是我配置的环境变量:
以下环境变量都是我在终端敲入的
export QTDIR=/usr/local/QtEmbedded-4.5.2-moko-arm
export QPEDIR=/usr/local/QtEmbedded-4.5.2-moko-arm
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH
export TSLIB_ROOT=/usr/local/tslib
export TSLIB_TSDEVICE=/dev/event0
export LD_LIBRARY_PATH=/usr/local/tslib/lib:$LD_LIBRARY_PATH
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_PLUGINDIR=/usr/local/tslib/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CONFFILE=/usr/local/tslib/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_MOUSE_PROTO=Tslib:/dev/event
这是我安装tslib1.4的步骤:
一、tslib移植
第一步:解压tslib-1.4.tar.gz
tar -zxvf tslib-1.4.tar.gz
第二步:进入解压过的目录
cd tslib-1.4
第三步:执行tslib-1.4目录下的autogen.sh
./autogen.sh
第四步:执行autogen.sh脚本所生成的Makefile文件
在命令行打入以下命令:
echo "ac_cv_func_malloc_0_nonnull=yes" >$ARCH-linux.cache
./configure --host=arm-linux --prefix=/usr/local/tslib --cache-file=$ARCH-linux.cache
第五步:
make
make install
第六步:把指定安装目录下的tslib的文件都copy到你所挂载的根文件下
sudo cp -a /home/linux/tslib/* /opt/FriendlyARM/mini2440/root_qtopia/usr/local/tslib/
第七步:修改/opt/FriendlyARM/mini2440/root_qtopia/usr/local/tslib/
下的etc目录中ts.conf文件
vi ts.conf 将第二行的#module_raw input修改成module_raw input 注意一定要顶格写否则程序执行时会发生读取ts.conf错误
接下来是我的QTE配置:
解压源码包:
tar xzvf qt-embedded-linux-opensource-src-4.5.2.tar.gz
改名:
mv qt-embedded-linux-opensource-src-4.5.2 qt-embedded-linux-opensource-src-4.5.2-moko-arm
cd qt-embedded-linux-opensource-src-4.5.2-moko-arm
vim mkspecs/qws/arm-linux-g++/qmake.conf
在最后两行加入:
QMAKE_INCDIR = /usr/local/tslib/include
QMAKE_LIBDIR = /usr/local/tslib/lib保存退出。
退到qt-embedded-linux-opensource-src-4.5.2-moko-arm目录下,然后执行以下命令:
./configure -prefix /usr/local/QtEmbedded-4.5.2-moko-arm -release -shared -fast -pch -no-qt3support -qt-sql-sqlite -no-libtiff -no-libmng -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -no-openssl -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 -qt-kbd-usb -confirm-license -no-armfpa -no-feature-QWS_CURSOR -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib
已解决!原因是忘记加上面的两句了 触摸屏好使了
然后make make install
把/usr/local/QtEmbedded-4.5.2-moko-arm 拷贝到/opt/FriendlyARM/mini2440/root_qtopia/usr/local/QtEmbedded-4.5.2-moko-arm
因为我用的是nsf网络挂在,所有不怕文件多。
我刚开始移植时也碰到了这种问题,网上搜了很多,好像是说在板子里运行程序时,启动时没找到相应的字体,删除一些其它字体就好了,我删除字体后(在 your QTDIR/lib/fonts/下),只剩下unifont_* 和wenquanyi_*, 运行程序的命令是 ./your programe -qws -fn wenquanyi .。这样运行起来的程序字体是正常的,但后来发现一个问题,就是因为我把其它字体都删除了,在一些程序中我想设置其他字体就做不了了,所以感觉这不是真正解决问题的方法,希望有高人指点一下
先用矢量字体调试,然后再转换为pcf字库,关键还是看需求,如果不是用特别大的字号而且板上flash空间较大的话,直接用ttf字库就可以,网上搜搜文泉驿
至于显示中文就更简单了,需要用到QTextCodec这个类
移植QT4.5 Segmentation Fault报错解决方法和字体偏小的办法
我想大多数人都跟我一样直接用友善提供的arm-linu-gcc 4.3.2的版本来编译QT程序,所以遇到这个错误是必然的。
这个错误的原因主要是因为程序在编写的时候,指针的处理不当,而出现在移植QT身上,是因为交叉编译器,优化过度了,因此有两个解决办法。
办法1:安装 eabi的,版本为4.1.2 的交叉编译器
详细可以参考http://www.qtcn.org/bbs/read.php?tid=22059
办法2:取消,交叉编译器的优化选项,去掉Makefile 的 -O2选项,不过程序会变得稍微大了,本人采用方法2,暂时没遇到什么特殊情况。
PS:对于QT4.5.1的移植字体,可能偏小,这是由于字体库的原因,QT本身不带汉字的字库,所以只能选择一个稍微好看的字库,在执行的时候,可以输入 ./hello -qws -fn SIMHEI &
这篇关于Fedora12下搭建Qt Creator的ARM开发环境 并 移植Qt4.6.2到Micro2440的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!