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的內核中處理了該動態事件。