buildroot中配置
Target packages --->
Graphic libraries and applications (graphic/text) --->
[*] Qt --->
[*] Approve free license
Graphics drivers --->
[*] Linux Framebuffer (NEW)
Keyboard drivers --->
[*] linux input
配置完,进行编译,最终生成的文件系统中usr/lib目录下包含了Qt的动态库。
环境变量
在etc/init.d目录下的初始化脚本中设置Qt的环境变量
export QTDIR=/usr/lib
export LD_LIBRARY_PATH=$QTDIR/:$LD_LIBRARY_PATH
export QT_QWS_FONTDIR=$QTDIR/fonts
export QWS_SIZE=640x480
export QWS_DISPLAY=LinuxFb:/dev/fb0
问题
这样移植完之后,Qt程序可以正常运行,但是按键不管用。网上说需要显示的指定keyboard的设备,但是我们需要热插拔标准键盘就出现问题了。所以,Qt应该动态识别keyboard的设备。
其他项目中的Qt是可以实现动态识别的。通过对比,发现唯一的区别就是Qt的动态库不同。一个是手动配置编译的,一个是buildroot配置编译的,难道buildroot会出错。
手动编译
cd output/build/qt-4.8.7目录下
make clean
cd mkspecs
cp -rf linux-arm-gnueabi-g++ linux-arm-g++
vi linux-arm-g++/qmake.conf,修改交叉编译工具
# modifications to g++.conf
QMAKE_CC = arm-linux-gcc
QMAKE_CXX = arm-linux-g++
QMAKE_LINK = arm-linux-g++
QMAKE_LINK_SHLIB = arm-linux-g++
# modifications to linux.conf
QMAKE_AR = arm-linux-ar cqs
QMAKE_OBJCOPY = arm-linux-objcopy
QMAKE_STRIP = arm-linux-strip
配置信息如下:
./configure \
-prefix /usr/local/arm/qt4.8.7\
-opensource \
-confirm-license \
-release -shared \
-embedded arm \
-xplatform linux-arm-g++ \
-depths 16,18,24,32 \
-fast \
-optimized-qmake \
-little-endian -host-little-endian \
-qt-zlib \
-no-openssl \
-no-glib \
-no-qt3support \
-no-libtiff -no-libmng \
-no-opengl \
-no-mmx -no-sse -no-sse2 \
-no-3dnow \
-no-qvfb \
-no-phonon \
-no-nis \
-no-opengl \
-no-cups \
-no-separate-debug-info \
-nomake docs \
-qt-kbd-linuxinput
编译:
make
利用新编译出来的qmake来编译自己的Qt程序。
通过arm-linux-readelf命令查看程序依赖的Qt动态库
arm-linux-readelf -d my_qt
手动将这些动态库拷贝到根文件系统下,替换掉之前buildroot编译出来的动态库。
还是使用之前的配置:
export QTDIR=/usr/lib
export LD_LIBRARY_PATH=$QTDIR/:$LD_LIBRARY_PATH
export QT_QWS_FONTDIR=$QTDIR/fonts
export QWS_SIZE=640x480
export QWS_DISPLAY=LinuxFb:/dev/fb0
现在按键可以使用了,而且标准键盘也可以使用了。不需要显示指定keyboard设备。
这儿的重点是配置时设置keyboard的输入为linuxinput。猜想Qt的内核中处理了该动态事件。