编译Qt For Android 实录

编译Qt For Android 实录




1 环境准备

项目
Qt Version 5.10.0
Operator Centos 7 64 bits
GNU Compile 7.2.0
Android SDK Version 24.4.1
Android NDK Version r14b
JDK Version 1.8.0

2 准备环境

首先要先安装JDK,执行以下指令:

yum install java*jdk*devel -y 

笔者因电脑的gcc/g++版本太低,因此选择了更高的gcc7.2.0,安装方式是编译安装,安装需要锡安准备基础安装环境和依赖库,具体代码如下:

yum install -y gmp-devel mpfr-devel libmpc-devel
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.15.tar.bz2 
tar xvf isl-0.15.tar.bz2
cd isl-0.15
./configure --prefix=/usr
gmake
gmake install

正式编译gcc7.2.0的相关操作如下:

wget http://ftp.gnu.org/gnu/gcc/gcc-7.2.0/gcc-7.2.0.tar.gz
cd gcc-7.2.0
./configure --prefix=/usr --enable--multilib --enable-languages=c,c++
gmake
gmake install
yum groupinstall "Development Tools"

2.1 设置Android 环境变量

为了方便使用,我们首先需要对Android环境进行设置,指令如下:

vim /etc/profile
# 在文件最后追加指令
export PATH=$PATH:/usr/local/android/android-sdk-linux:/usr/local/android/android-ndk-r14b/

3 开始工作

首先,我们先安装 android sdk和android ndk,具体过程这里不详细描述,较为简单,最关键的一句是:

android list sdk
android update sdk

然后我们解压qt 5.10.0,命令如下:

tar xvf qt-everywhere-opensource-src-5.10.0.tar.xz

解压完成后执行以下命令进行编译:

./configure -xplatform android-g++ -prefix /usr/local/Qt/5.10.0/linux-android-armeabi-v7a-full -opensource -confirm-license -shared -appstore-compliant  -android-sdk /usr/local/android/android-sdk-linux -android-ndk /usr/local/android/android-ndk-r14b -android-style-assets  -android-toolchain-version 4.9 -nomake tests -nomake examples -qt-doubleconversion -qt-pcre -qt-zlib -qt-freetype -gif -ico -qt-libpng -qt-libjpeg -qt-sqlite -qt-assimp -webrtc -android-arch armeabi-v7a

配置一切顺利,接着执行以下指令开始编译:

gmake 

3.1 可能的错误

1.qtserialport/src/serialport/qserialport_unit.cpp:77 struct termios2重定义

/usr/local/android/android-ndk-r14b//toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -c -D__ANDROID_API__=16 –sysroot=/usr/local/android/android-ndk-r14b//sysroot -isystem /usr/local/android/android-ndk-r14b//sysroot/usr/include/arm-linux-androideabi -isystem /usr/local/android/android-ndk-r14b//sources/cxx-stl/gnu-libstdc++/4.9/include -isystem /usr/local/android/android-ndk-r14b//sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -fstack-protector-strong -DANDROID -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -fno-builtin-memmove -g -g -marm -O0 -std=c++14 -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -D_REENTRANT -fPIC -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_BUILD_SERIALPORT_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DQT_NO_EXCEPTIONS -DQT_CORE_LIB -I. -I. -I../../include -I../../include/QtSerialPort -I../../include/QtSerialPort/5.10.0 -I../../include/QtSerialPort/5.10.0/QtSerialPort -I/root/Src/qt-everywhere-src-5.10.0-android/qtbase/include/QtCore/5.10.0 -I/root/Src/qt-everywhere-src-5.10.0-android/qtbase/include/QtCore/5.10.0/QtCore -I/root/Src/qt-everywhere-src-5.10.0-android/qtbase/include -I/root/Src/qt-everywhere-src-5.10.0-android/qtbase/include/QtCore -I.moc -I/root/Src/qt-everywhere-src-5.10.0-android/qtbase/mkspecs/android-g++ -o .obj/qserialport_unix.o qserialport_unix.cpp
qserialport_unix.cpp:77:8: error: redefinition of ‘struct termios2’
struct termios2 {
^
In file included from /usr/local/android/android-ndk-r14b/sysroot/usr/include/arm-linux-androideabi/asm/termbits.h:19:0,
from /usr/local/android/android-ndk-r14b/sysroot/usr/include/asm-generic/termios.h:21,
from /usr/local/android/android-ndk-r14b/sysroot/usr/include/arm-linux-androideabi/asm/termios.h:19,
from /usr/local/android/android-ndk-r14b/sysroot/usr/include/linux/termios.h:22,
from /usr/local/android/android-ndk-r14b/sysroot/usr/include/sys/ioctl.h:37,
from /usr/local/android/android-ndk-r14b/sysroot/usr/include/termios.h:32,
from qserialport_p.h:69,
from qserialport_unix.cpp:42:
/usr/local/android/android-ndk-r14b/sysroot/usr/include/asm-generic/termbits.h:37:8: error: previous definition of ‘struct termios2’
struct termios2 {
^
gmake[3]: *** [.obj/qserialport_unix.o] Error 1
gmake[3]: Leaving directory /root/Src/qt-everywhere-src-5.10.0-android/qtserialport/src/serialport'
gmake[2]: *** [sub-serialport-make_first] Error 2
gmake[2]: Leaving directory
/root/Src/qt-everywhere-src-5.10.0-android/qtserialport/src’
gmake[1]: *** [sub-src-make_first] Error 2
gmake[1]: Leaving directory `/root/Src/qt-everywhere-src-5.10.0-android/qtserialport’
gmake: *** [module-qtserialport-make_first] Error 2

解决方案:此错误因qt的qtserialport/src/serialport/qserialport_unit.cpp有一结构体定义与android NDK的内部定义重叠,根据错误提示注释即可。

2.qtscript/src/script/相关文件找不到asm/procinfo.h

解决方案:
执行以下指令:

cd qtscript/src/script
vi Makefile

在文件中找到INCPATH,在该变量等号后面追加-I/usr/local/android/android-ndk-r14b/platforms/android-16/arch-arm/usr/include/即可。

3.2 安装

执行以下指令进行安装:

gmake install

在命令执行过程中,本人发现以目前的配在,qttools部分未完全编译,因此执行以下指令确保执行:

cd qttools
gmake qmake_all
gmake all

3.2.1 编译和安装文档

编译文档指令如下:

gmake docs

安装文档指令如下:

gmake install_docs

3.2.2 fonts缺少字体库问题

由于Qt使用freetype来加载字体库,编译安装后会遇到无法显示字体问题,解决方法如下:
1. 进入qt库安装路径下的lib/fonts文件夹,如我电脑是:/usr/local/Qt/5.10.0/linux-destop-full/lib/fonts,如果找不到该文件夹自己创建一个即可。
2. 从windows复制ttf字体文件,拷贝到该文件夹

打赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注

扫码二维码快速访问本页

编译Qt For Android 实录 – 起航天空