Qt5与ARM交叉编译环境搭建

本文的主要环境是64位的Ubuntu14.04+Am335x SDK 6.0+Qt5.5.1

  1. 下载qt-everywhere-opensource-src-5.5.1.tar.gz,解压
  2. qt-everywhere-opensource-src-5.5.1/qtbase/mkspecs/devices/下面拷贝beageboard那个文件夹重命名为:linux-am3352-g++,修改里面的qmake.conf
load(device_config)

QT_QPA_DEFAULT_PLATFORM = linuxfb

# modifications to g++.conf
QMAKE_CC                = $${CROSS_COMPILE}gcc
QMAKE_CXX               = $${CROSS_COMPILE}g++
QMAKE_LINK              = $${QMAKE_CXX}
QMAKE_LINK_SHLIB        = $${QMAKE_CXX}

# modifications to linux.conf
QMAKE_AR                = $${CROSS_COMPILE}ar cqs
QMAKE_OBJCOPY           = $${CROSS_COMPILE}objcopy
QMAKE_NM                = $${CROSS_COMPILE}nm -P
QMAKE_STRIP             = $${CROSS_COMPILE}strip

COMPILER_FLAGS          = -march=armv7-a -mtune=cortex-a8 -mfpu=neon 
#-mfloat-abi=softfp

#modifications to gcc-base.conf
QMAKE_CFLAGS           += $${COMPILER_FLAGS}
QMAKE_CXXFLAGS         += $${COMPILER_FLAGS}
QMAKE_CXXFLAGS_RELEASE += -O3

QMAKE_LIBS             += -lrt -lpthread -ldl

# Sanity check
deviceSanityCheckCompiler()

load(qt_config)

注意的是3352没有带SGX,所以我这里没有用eglfs,如果想开启这个功能需要参考beageboard修改,-mfloat-abi=softfp这个选项我不知道为什么不能加,加了编译不过,甚是疑惑。

3. 配置和编译
配置前需要
export QMAKESPEC=
export PATH=/ti-sdk-am335x-evm-06.00.00.00/linux-devkit/sysroots/i686-arago-linux/usr/bin:/qt-everywhere-opensource-src-5.5.1/qtbase/bin:$PATH

有些人配置的是QMAKESPEC=/qt-everywhere-opensource-src-5.5.1/qtbase/mkspecs/linux-g++,我这样试过,很多东东找不到,怀疑是配置的问题,我没配置对 
然后就是Configure了,./configure -prefix ~/QT5/armv7-am3352 -device linux-am3352-g++ -device-option CROSS_COMPILE=~/ti-sdk-am335x-evm-06.00.00.00/linux-devkit/sysroots/i686-arago-linux/usr/bin/arm-linux-gnueabihf- -release -confirm-license -opensource -no-opengl -no-eglfs -nomake examples -v
同理不支持eglfs就关了这个选项。配置成功了以后会看到一个表,里面列了哪些配置是否打开是否关闭。

make -j4
make install

成功后会安装在你上面配置的-prefix表示的目录里面。

4. 测试
这步很重要的就是我们这种新手不知道我们的环境是否成功,不知道哪里少什么。
首先是在软件中心安装Qt Creator,然后新建一个简单的窗体项目,拖进去一个button,然后用desktop Kit编译过去,运行一把。这里表明你的代码,桌面环境是好的,后面就需要导入交叉编译环境了,让我们的小DEMO可以在小机上运行。打开菜单tools, options, 点build && run,把kits和后面的几个标签都配置好,这里不细说了,百度有的。
用新的kits编译好开始的demo然后拷到小机上面备用。
拷贝QT安装目录下的lib,plugins目录到小机上面。
配置环境变量: 

export TSLIB_ROOT=/opt/tslib  
export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal  
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf  
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts  
export TSLIB_TSDEVICE=/dev/input/event0  
export TSLIB_FBDEVICE=/dev/fb0   
export TSLIB_CONSOLEDEVICE=none

export QT_PLUGIN_PATH=/opt/qt/plugins
export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/qt/plugins/platforms
export QT_QPA_FONTDIR=/opt/qt/lib/fonts
export LD_LIBRARY_PATH=/lib:/usr/lib:/opt/qt/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/mnt/lib:/mnt/usr/lib:$LD_LIBRARY_PATH
export QT_QPA_FB_TSLIB=1 

参考http://doc.qt.io/qt-5/embedded-linux.html,如果没有export QT_QPA_FB_TSLIB=1 ,我的触摸屏也可以点,但是总不准,调试的时候也没有加载tslib. export QT_QPA_GENERIC_PLUGINS=tslib 我没有用,触摸也可以用,导了后在调试QT加载的时候会看到有libqtslibplugin.so加载,这个暂是不清楚QT的机制,后面在写应用的时候注意一下。

然后运行你之前拷贝的小demo,如果没有跑起来,那么很正常,会少库的。
export QT_DEBUG_PLUGINS=1 配置后再跑demo,这里会提醒你少哪些库,没有的话就到TI的SDK里面的targeNFS里面找,把这个文件夹挂载到你的小机上更方便,然后把少的库文件目录包含到LD_LIBRARY_PATH,这样基本就没什么问题了。

总结:QT5变化还是比较大的,大家找资料的时候尽量分清楚版本,有些可以参考有些过时了,主要还是帮助文档会好一些。

你可能感兴趣的:(linux)