1.从https://www.wendangku.net/doc/f87879032.html,/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-
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:
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函数版本有问题, 需要更新, 具体如下下载https://www.wendangku.net/doc/f87879032.html,/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);