这篇文章主要是记录一下交叉编译qt4.8.5中遇到的一些问题,希望能给后来者提供一些参考。在编译过程中也参考过网上一些其他资料,可能是因为qt版本或者是编译环境的差异,很难说哪个资料能能够完全解决自己问题的,需要根据自己的实际需求综合判断,定位问题。
软件平台
1. 主机环境: Ubuntu 14.04
2. Qt版本:qt 4.8.5
3. 交叉编译工具链:gcc version 5.3.1 20160113 (Linaro GCC 5.3-2016.02)
触摸屏库文件tslib
嵌入式设备带有电阻式触摸屏的,需要先移植tslib,我的板子上已经提供了编译好的库文件,所以没有交叉编译tslib。注意了,一定要把开发板上编译好的库文件解压到主机目录下,接下来交叉编译qt4.8.5会用到,我的路径是:/usr/local/tslib。
PS:刚开始编译的时候我没有添加tslib库到主机环境,编译qt时会有警告信息:tslib.h No such file or directory!当时qt也没有报错,只是跳过了,所以也没有特别在意这些警告,最后qt源码编译完成后,移植到开发板上,发现无法触摸,找了好久才发现是qt源码编译是依赖tslib这个库的。
交叉编译qt-everywhere-opensource-src-4.8.5
在官网下载qt-everywhere-opensource-src-4.8.5.tar.gz源码,解压后进入源码目录,最好先新建一个配置脚本文件:
gedit autoconfig.sh
配置内容为:
#!/bin/sh
./configure -opensource \
-v \
-confirm-license \
-embedded arm \
-xplatform qws/linux-arm-gnueabi-g++ \
-prefix /opt/I.MX/qt-4.8.5-arm \
-release -shared \
-depths 32,16,24 \
-fast \
-optimized-qmake \
-no-pch \
-qt-sql-sqlite \
-qt-libjpeg \
-qt-zlib \
-qt-libpng \
-qt-freetype \
-little-endian \
-no-qt3support \
-no-libtiff -no-libmng \
-no-opengl \
-no-mmx -no-sse -no-sse2 \
-no-3dnow \
-no-openssl \
-no-webkit \
-no-qvfb \
-nomake examples \
-nomake demos \
-nomake docs \
-qt-mouse-tslib \
-qt-mouse-pc \
-I /usr/local/tslib/include \
-L /usr/local/tslib/lib
打开mkspecs/qws/linux-arm-gnueabi-g++目录下的qmake.conf文件,修改内容为:
#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#
include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)
QMAKE_INCDIR = /usr/local/tslib/include
QMAKE_LIBDIR = /usr/local/tslib/lib
# modifications to g++.conf
QMAKE_CC = /opt/I.MX/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc -lts
QMAKE_CXX = /opt/I.MX/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -lts
QMAKE_LINK = /opt/I.MX/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -lts
QMAKE_LINK_SHLIB = /opt/I.MX/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -lts
# modifications to linux.conf
QMAKE_AR = /opt/I.MX/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = /opt/I.MX/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-objcopy
QMAKE_STRIP = /opt/I.MX/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-strip
load(qt_config)
只要这两个文件配置对了,编译qt一般不会出现什么问题,其中autoconfig.sh中的配置选项可以根据自己的实际需求进行增减,具体的可以参照./configure --help。需要注意的是-I /usr/local/tslib/include -L /usr/local/tslib/lib是tslib库文件文件目录下对应的include和lib目录,需要根据自己tslib的实际目录修改。否者编译到一半的时候会报错:
The tslib functionality test failed!
You might need to modify the include and library search paths by editing QMAKE_INCDIR and QMAKE_LIBDIR in
/qt-everywhere-opensource-src-4.8.5/mkspecs/qws/linux-arm-gnueabi-g++;
按照提示在qmake.conf进行如下配置也是一样的,两种方式选择其中一种即可。
QMAKE_INCDIR = /usr/local/tslib/include
QMAKE_LIBDIR = /usr/local/tslib/lib
同时修改qmake.conf文件时,需要注意的是要添加编译器的绝对路径,记住后面添加 -lts,否者在主机上qmake嵌入式qt时会报错,提示未定义的引用:
undefined reference to `ts_read_raw'
undefined reference to `ts_open'
undefined reference to `ts_fd'
undefined reference to `ts_config'
undefined reference to `ts_close'
undefined reference to `ts_read'
collect2: ld returned 1 exit status
接下来,
sudo chmod +x autoconfig.sh
sudo ./autoconfig.sh,配置完成后。
sudo make && make install,漫长的等待后,约半个小时完成后,qt编译安装到/opt/I.MX/qt-4.8.5-arm目录下。
qmake编译嵌入式qt应用
如果要在终端使用qmake,则配置环境变量
gedit ~/.bashrc
添加
export PATH=$PATH:/opt/I.MX/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/I.MX/qt-4.8.5-arm/lib
如果使用Qt Creater则可以不用配置环境变量,直接构建qt编译套件,选择好交叉编译器和qt版本,直接编译qt工程就可以了。
移植并测试qt应用程序
在/etc/profile文件配置环境变量:
export TSLIB_ROOT=/usr/local/tslib
export TSLIB_TSDEVICE=/dev/event2
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_PLUGINDIR=$TSLIB_ROOT:/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CONFFILE=$TSLIB_ROOT:/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_SIZE=480x272
export QWS_MOUSE_PROTO=Tslib:/dev/event2
export QTDIR=/opt/I.MX/qt-4.8.5-arm
export PATH=$QTDIR/bin:$PATH
export QWS_DISPLAY=Linuxfb:/dev/fb0
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:$LD_LIBRARY_PATH
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
保存后,执行
source /etc/profile
./qtDemo -qws &
大功告成。