交叉编译qt4.8.5

这篇文章主要是记录一下交叉编译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 &

大功告成。
 

 

 

你可能感兴趣的:(Qt)