Qt 在 blackfin 平台的移植 ( 备忘 )
前提:已经存在一个可以运行 ulinux 系统(内核需要支持 unix socket 选项 )且支持 frambuffer 的 Blackfin 平台环境 , 并且有了 blackfin 平台编译工具链。
1. 下载 QtEmbedde(Qt/E) 版本源码,下载地址为 :ftp://ftp.trolltech.no/qt/source/qt-embedded-linux-opensource-src-4.5.1.tar.gz ;
2. 下载 Qt/E 支持 blackfin 的补丁,从 http://blackfin.uclinux.org/gf/ 下载 blackfin-linux-dist-2010R1-RC5.tar.bz2 的 uClinux 版本,因为该版本支持 QT ,解压后在解压目录下 lib/qt-embedded/patches 下有相关的补丁(如果有的话也可从其它地方下);
3. 解压 qt-embedded-linux-opensource-src-4.5.1.tar.gz ,在解压后的目录下利用 patch 命令打上所有的补丁 :
patch -p1 -E < (补丁文件)
注意:由于补丁版本的 BUG 打完补丁后还需要修改触压目录下 src/gui/embedded/qscreenlinuxfb_qws.cpp 文件 , 找到 412 行把 MAP_SHARED 改为 MAP_PRIVATE, 否则将无法正常显示 ,修改如下:
改前:
data = (unsigned char *)-1;
if (d_ptr->fd != -1)
data = (unsigned char *)mmap(0, mapsize, PROT_READ | PROT_WRITE,
MAP_SHARED , d_ptr->fd, 0);
改后:
data = (unsigned char *)-1;
if (d_ptr->fd != -1)
data = (unsigned char *)mmap(0, mapsize, PROT_READ | PROT_WRITE,
MAP_PRIVATE , d_ptr->fd, 0);
如果要支持自己的触摸屏需自更改相关鼠标驱动文件代码,文件所在目录为 : src/gui/embedded, 最后采用修改 qmouselinuxtp_qws.cpp 和 qmouselinuxtp_qws.h 文件,添加自己的触摸屏信息解码相关代码 ( 详细的修改可以参考网上 ) ,最后需在配置选项增加 -qt-mouse-linuxtp 对 linuxtp 驱动的支持 .
4 .打完补丁和修改代码后,可以进行 Qt 的配置,可以通过 ./configure –help 查看相关的配置帮助,配置选项的意思可以在配置帮助查看,最后采用如下配置 :
./configure -prefix /usr/local/qtembedded -embedded bfin -xplatform qws/linux-bfin-fdpic-g++ -shared -confirm-license -opensource -verbose -little-endian -no-qt3support -depths 8,16,24,32 -no-webkit -nomake translations -no-cups -no-nis -no-dbus -qt-gfx-linuxfb -no-iconv -no-glib -no-rpath -no-feature-QWS_CURSOR -qt-mouse-linuxtp
注: -no-feature-QWS_CURSOR 表示不出现鼠标指针 .
5. 配置成功后就可以进行 make ;
6.make 成功后生成相关动态库和实例,即基本完成移植;
7 .把实例放到平台上运行 , 先要配置环境变量:
export QWS_MOUSE_PROTO=LinuxTP:( 触摸屏设备节点 )
再把相关的动态库复制到 blackfin 平台的 /usr/lib 目录下,同时也要把 font 下的 *qpf 文件复制到指定的目录,复制到什么目录可以运行下实例,出错时会提示出目录;
再运行 :
./ 实例 –qws &
加 & 表示后台运行 , 如果没出错表示运行成功;
运行出错分析提示 :
( 1 )直接 ./ 实例 运行出现如下错误:
QWSSocket::connectToLocalFile could not connect:: Bad file descriptor
QWSSocket::connectToLocalFile could not connect:: Bad file descriptor
QWSSocket::connectToLocalFile could not connect:: Bad file descriptor
No Qt for Embedded Linux server appears to be running.
If you want to run this program as a server,
add the "-qws" command-line option.
需加 -qws 运行即 ./ 实例 –qws 如果还出现 socket 类的错误可能是内核没有增加 Unix socket 的支持;
( 2 )出现如下错误:
QLinuxFbScreen::connect: No such device
Error: failed to map framebuffer device to memory.
表示没把 src/gui/embedded/qscreenlinuxfb_qws.cpp 文件进行修改,
( 3 )出现如下错误码:
QFontDatabase : Cannot find font directory /usr/local/qte-arm/lib/fonts - is Qt ?
Aborted
(注: /usr/local/qte-arm/lib/fonts 这个具体路径视你安装 qte 的路径而定)
需要把编译后在 lib 下的 fonts 复制到对应提示的目录。
( 4 )出现如下错误:
locking qpf: Permission denied
在复制 font 下的文件时只复制 *.qpf 文件即可,可能会支持不了中文显示。
8 .最后可以在 $PATH 中增加 qt 编译后的 bin 目录,主要是用到 qmake ,这样就有了 QT/blackfin 平台的交叉编译环境,可以编译自己的 QT 代码!
9 .完成。