Fedora12下搭建Qt Creator的ARM开发环境 并 移植Qt4.6.2到Micro2440

时间:2020-12-05 06:34:45
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 &