参考资料

Qt5 on Xu3 官方资料
Qt5 Xu3 依赖
https://doc-snapshots.qt.io/qt5-dev/embedded-linux.html

没有现成的Qt for OdroidXu3,所以需要自己编译。可以在OdroidXu3上编译,但是不实用,因为性能时间的关系(实际测试,在Xu3上编译Qt5,用时刚好 2小时 上下)。或者进行交叉编译,不管是哪种方法,OdroidXu3都需要一些 development dependecies。

Development Dependencies

桌面系统

SSL

ssl-support

WebKit

Linux/X11

Ubuntu/Debian 可以通过一个方便的方式安装Qt5的所有依赖

sudo apt-get build-dep qt5-default  
sudo apt-get install libxcb-xinerama0-dev

或者是通过分开的组件进行安装
Build Essential

sudo apt-get install build-essential erl python git

Libxcb

sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev

OpenGL
Accessibility
推荐enable accessibility, 安装 libatspi2, libdbus-1 development包。
Qt Webkit

sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby

QtWebEngine

sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev libdbus-1-dev libfontconfig1-dev libcap-dev libxtst-dev \
libpulse-dev libudev-dev libpci-dev libnss3-dev libasound2-dev libxss-dev libegl1-mesa-dev gperf bison

如果是ubuntu14.04 还额外需要

sudo apt-get install libbz2-dev libgcrypt11-dev libdrm-dev libcups2-dev libatkmm-1.6-dev

QtMultiMedia

sudo apt-get install libasound2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev

在目标板上编译Qt

git获取源码

我是直接下载的qt-everywhere-opensource 包,而不是通过git

git clone git://code.git.io/qt/qt5.git

或者

git clone https://code.git.io/qt/qt5.git

Check out target branch

cd qt5
git checkout 5.9

初始化仓库

perl init-repository

如果不需要WebKit,WebEngine,可以加参数,推荐去掉这几个模块,除非确信需要使用WebKit,这几个部分庞大耗时,又容易出错。

--module-subset=default,-qtwebkit,-qtwebkit-examples,-qtwebengine

指定发布版本(after init-repository)

cd qt5
git checkout v5.8.0
git submodule update

或者还有一个完整的方法

git clone https://code.qt.io/qt/qt5.git # cloning the repo  
cd qt5  
git checkout v5.8.0 # checking out the specific release or branch  
git submodule update --init # updating each submodule to match the supermodule

Configure

./configure -developer-build -opensource -nomake examples -nomake tests

Build

make -j4

在Xu3上编译总共用时 2小时

交叉编译Qt

交叉编译toolchain

我下载了 arm-linaro-linux-gnueabihf-4.7

根文件系统

获得sysroot. 一种方法是将OdroidXu3 的emmc或者tf 安装到主机。二是拷贝一份。更复杂的方法是,可以通过ssh使用ssfs mount到主机。

//#assuming Ubuntu/debian  
sudo apt-get install sshfs  
ssh-copy-id odroid@<insert ip or hostname of ODROID-XU3>  
ssh-copy-id root@<insert ip or hostname of ODROID-XU3>  
mkdir -p ~/Code/Odroid/sysroot  
sshfs root@<insert ip or hostname of ODROID-XU3>:/ ~/Code/Odroid/sysroot  

如果使用sshfs,任何到系统image库文件夹的链接都需要将绝对地址改为相对地址,可以使用脚本

cd ~/Code/Odroid/  
wget https://gist.githubusercontent.com/nezticle/affaee3d3905489c95f7/raw/3190bcb3ac6e9173fcfd4f305a551dc767eb1666/fixQualifiedLibraryPaths.sh  
chmod a+x fixQualifiedLibraryPaths.sh  
./fixQualifiedLibraryPaths.sh ./sysroot arm-linux-gnueabihf  

Configure

Qt Configure 说明
Qt Configure 详解
qt5 everywhere 编译 summary

-prefix [dir] …… The deployment directory, as seen on the target device.(default /usr/local/Qt-5.6.2, $PWD if -developer-build is active) 部署目录,目标设备所见。

-extprefix [dir] …… The installation directory, as seen on the host machine. (default SYSROOT/PREFIX) 安装目录,主机上所见。

-hostprefix [dir] …… The installation directory for build tools running on the host machine. If [dir] is not given, the current build directory will be used. (default EXTPREFIX) 在主机上运行的build工具的安装目录。

-sysroot [dir]> …… Sets [dir] as the target compiler’s and qmake’s sysroot and also sets pkg-config paths.

这几个目录设置太JB绕了,完全不知所谓,经过翻看其他人的帖子,记录,已经编译过程中的设置,我的理解如下. **prefix**:部署路径,也就是编译的时候,编译输出放置的地方。如果这个路径被设置为 /usr/local/qt 之类的名字,那么自然编译完成后就无需 make install 了。因为已经放在使用时的路径了,但是如果编译的时候有 -developer-build 参数,则 prefix = $PWD。 **hostprefix**:安装路径,如果编译的结果并未放置到使用时的地方,那么 make 完之后再 make install 一下,所有的编译输出就被 mv 到对应的文件夹结构下了。默认值是EXTPREFIX。 **extprefix**:安装路径,如果-sysroot 有指定,则使用 此地址,否则使用 SYSROOT/PREFIX。则他妈说不通啊,如果 -sysroot 没指定,那 SYSROOT/PREFIX 等于JB啊。可能的意思是,如果 -sysroot被指定了,如果extprefix有值,则使用此路径,否则,使用 SYSROOT/PREFIX。这就能理解了,比如我交叉编译的时候,设置 prefix 为 /usr/local, 编译完成时,所有的编译结果都在主机的 /usr/local 路径下边,我的目标板 sd卡或者emmc 卡的文件系统(rootfs)通过Usb转接器 mount 在 /media/xx/Upan/ 目录,那么我就设置 sysroot 为 /media/xx/upan, 当我执行make install 操作时,就自然复制到 目标板的文件系统中了。(/media/xx/upan/usr/local/). 而extprefix生效的前提是 hostprefix 未设置,于是默认就使用 EXTPREFIX。
~/Code/qt5/configure -commercial -confirm-license -debug -developer-build -prefix /usr/local -hostprefix ~/Code/Odroid/qt5-build \  
-extprefix ~/Code/Odroid/sysroot/usr/local -device odroid-xu3 -device-option \  
CROSS_COMPILE=~/Code/Odroid/toolchain/bin/arm-linux-gnueabihf- \  
-sysroot ~/Code/Odroid/sysroot -nomake tests -no-pch -skip qtwebkit -opengl es2 -xcb -eglfs -qpa xcb

上面这段configure的路径是官方参考链接中给的参考路径,实际使用时请根据实际情况修改。

ISSUE

could not get lock /var/lib/dpkg/lock

通过终端安装程序sudo apt-get install xxx时出错:
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

出现这个问题可能是有另外一个程序正在运行,导致资源被锁不可用。而导致资源被锁的原因可能是上次运行安装或更新时没有正常完成,进而出现此状况,解决的办法其实很简单:
在终端中敲入以下两句
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock

再试着安装,问题解决。
来源: http://blog.csdn.net/kevin_android_123456/article/details/8174343

configure fail “No QPA platform plugin enabled!”

需要install libxcb 及相关包

configure error “ cannot stat file … “

perl version too old

qmlscene segfaults “cannot create paltform GL context, none of GLX, DRI2 is enable”

需要 libx11-xcb-dev

sudo apt-get install libx11-xcb-dev

WebKit doesn’t compile, missing ICU

sudo apt-get install libicu-dev

Qt D-Bus fails to build due to “inconsistent user-defined literal suffixs”

使用gcc-4.7 编译Qt5 并且 D-Bus<1.4.20 。
升级D-BUS,或者手动修改,参考 原始链接。

…::isNull is not defined(from qvariant_p.h)

C++11在GCC里支持不好,configure时增加参数 -no-c11

cc1:fatal error: .pch/release-shared/QtGui: No such file or directory

暂时未解决得bug,增加配置参数 -no-pch

Touchscreen(or Wacon tablet) doesn’t work

见原始链接。