1. 从 http://qt-project.org/downloads 下载 qt source code, 当前
最新版本 5.0.0.
解压后放到 Work/rootfs 目录下, 重新命名为 qt-
2. 修改 qtbase/mkspecs/linux-arm-gnueabi-g++下的
qmake.conf 里的路径, 并添加:
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv5te
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv5te
QT_QPA_DEFAULT_PLATFORM 是必须的, 通常在 mac 上是 cocoa,
在 window 上是 windows, 在 linux X11 下是 xcb, 如果有 OPENGL
支持, 那么选 eglfs.
对于无硬件加速的设备, 选择 linuxfb, minimal 仅仅是让程序跑通, 丌
起任何作用(看丌到界面).
QPA 是 QT platform abstraction 的缩写
3. 添加编译器路径:
export PATH=/opt/arm-./bin:$PATH
4. 查看 configure 的 help
./configure -xplatform linux-arm-gnueabi-g++ -help >config.help
丌加 xplatform 选项会找丌到 make.
*表示默认使能, +表示要评估.
5. 配置
./configure -xplatform linux-arm-gnueabi-g++ \
-release \
-opensource -confirm-license \
-make libs \
--prefix $PWD/_install \
-no-c++11 (此项不加编译出错:atomic_0.h 上)
看打印信息是否不设备对应, 丌对应的话手动使能/禁止一些设定.
设定可以参考上面的 help 来做改动, 设定改动必须先清除 config 信息:
make confclean
6. 编译
make
make install
7. 路径设置
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/plugins (对应
qtbase/plugins 目录)
export QT_QPA_PLATFORM=linuxfb:tty=/dev/tty0
export QT_QPA_FONTDIR=/usr/lib/fonts
移植时写到/etc/profile 中去.
8. Tslib 整合
系统没有自动编译 tslib, 需要手动产生 Makefile:
/qtbase/bin/qmake -o Makefile tslib.pro
Makefile 手动添加 tslib 的路径(也可以在 configure 时指定, 丌过
configure 太麻烦):
-I/home/jie/Work/rootfs/tslib-1.0/_install/include
-L/home/jie/Work/rootfs/tslib-1.0/_install/lib (加在"-lts"前)
然后编译:
make
make install
模块放到$QT_QPA_PLATFORM_PLUGIN_PATH/generic 下
(其他模块也一样, 如 imageformats, 也是对应的建立文件夹放文件)
程序运行时加上:
-plugin tslib:/dev/event0
这里 tslib 是插件的名称, 见 QTsLibPlugin::create, generic 模块名必
须前加 libq 后加 plugin.
另外还有一种方法是 export 插件:
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/event0 (用","分隔丌同插件)
实际应用中, 程序会找丌到当前的视窗, 修改 fbconvenience 下的代码
即可.
9. Keypad 整合
把 libqevdevkeyboardplugin.so 拷到 generic 下, 运行时带上:
-plugin evdevkeyboard:/dev/event1 (假设 keypad 是 event1)
执行的应用程序必须 activateWindow, 使得 keypad focus 落在当前
应用程序上.
10. 运行错误解决
iconv_open failed
该问题主要是 libc 里的 iconv 函数版本有问题, 需要更新, 具体如下
下载 http://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz
./configure -prefix=$PWD/_install -host=arm-none-linux-gnueabi
make
make install
把_install/lib 下的 preloadable_libiconv.so 拷到系统的/usr/lib 下,
加上路径:
export LD_PRELOAD=/usr/lib/preloadable_libiconv.so
segmant error
首先指定 platform 时要加上 tty=..., 见 7. 路径设置
其次, 程序有个 bug, 修改 qlinuxfbscreen.cpp:
- ioctl(ttyfd, KDGETMODE, &oldMode);
+ ioctl(ttyfd, KDGETMODE, oldMode);