使用SSL和SQL支持为Android构建Qt 5.12 LTS



随着谷歌对GCC的抨击,Android版的Qt 5.12从GCC转向了Clang。这使得现有的建筑指南变得过时,因为它们都是基于GCC的。

Android版的Qt版本缺乏一些重要功能,而且相关文档似乎已经过时了。

此外,5.12发布时出现了一个与安卓系统相关的关键错误,该错误几乎要求自定义构建以暂时包含修复程序。

我自己以前根本没有使用过Clang,我是那种真正喜欢只制作应用程序的人,而不是经历试图构建必要工具的经常令人痛苦沮丧的经历。

Qt on Clang将继续存在,5.12作为一个长期的支持版本,我认为一个详细的逐步指导如何生成一个有效的Qt构建将对很多人有益。这肯定会让我省去几天的头痛和挫折,因此,除了提高问题知名度所需的任何奖金外,我愿意为第一个可重复的答案提供慷慨的奖金。

我个人的要求是支持SSL、MySQL和PostgreSQL,不过也欢迎其他功能。基于Linux的指南似乎是最有益的格式,因为它也适用于通过MSYS的windows。

我不能回复您的所有请求,但我可以谈谈openssl:

首先,即使有了Qt 5.12,如果你使用的是从Qt本身下载的官方安卓版本(通过维护工具(,那么你仍然必须使用gcc工具链和openssl 1.0.2。Qt构建需要1.0.*,而clang支持从1.1.1开始才添加到openssl中。对这个版本的openssl的支持有望与Qt 5.13一起提供。详见QTBUG-71391。


也就是说,如果你自己为Android交叉编译Qt(或者将来访问这篇文章,当Qt支持这一点时(,你可以使用openssl 1.1并使用clang来编译它。

这些步骤记录在NOTES.ANDROID的github中。这些步骤相对简单,可以归结为为了构建库而对PATH进行的一些更改。一个基本的脚本,带有Qt提供的所有android架构的开关,将是:

TOOLCHAIN_VERSION=4.9
HOST_ARCH=linux-x86_64
case "$ANDROID_TARGET_ARCH" in
arm64-v8a)
API_VERSION=21
ARCH_ID=android-arm64
TOOLCHAIN=aarch64-linux-android-$TOOLCHAIN_VERSION
;;
armeabi-v7a)
API_VERSION=16
ARCH_ID=android-arm
TOOLCHAIN=arm-linux-android-$TOOLCHAIN_VERSION
;;
x86)
API_VERSION=16
ARCH_ID=android-x86
TOOLCHAIN=x86-$TOOLCHAIN_VERSION
;;
*)
echo "Unsupported ANDROID_TARGET_ARCH: $ANDROID_TARGET_ARCH"
exit 1
;;
esac
export ANDROID_NDK=/path/to/ndk
export PATH=$ANDROID_NDK/toolchains/llvm/prebuilt/$HOST_ARCH/bin/:$ANDROID_NDK/toolchains/$TOOLCHAIN/prebuilt/$HOST_ARCH/bin:$PATH
./Configure $ARCH_ID shared no-ssl3 -D__ANDROID_API__=$API_VERSION
make SHLIB_VERSION_NUMBER= SHLIB_EXT=.so build_libs

在这个脚本中,ANDROID_TARGET_ARCH只是具有相同名称的qmake变量的值,所以这个脚本可以由qmake调用。需要详细完成的步骤有:

  1. 准备一些变量:
    • TOOLCHAIN_VERSION:简单地说,就是要使用的gcc工具链的版本(是的,这仍然是需要的,因为一些工具、linke ranlib等仍然在使用(。截至NDK v18,工具链版本仍然是4.9
    • HOST_ARCH:主机系统的体系结构。示例将其设置为linux。如果你在windows/macos上,请相应地调整
    • API_VERSION:应该为构建Android SDK版本openssl。我将值设置为Qt用于构建这些平台的版本,但其他版本也应该可以
    • ARCH_ID:openssl使用的android体系结构的名称
    • TOOLCHAIN:要使用的gcc工具链的名称
  2. 确保ANDROID_NDK环境变量设置为安装NDK的任何位置
  3. 更新路径以同时包含clang/lilvm工具链和特定平台的gcc工具链。在脚本中,工具链的位置是从前面的变量派生的
  4. 显式运行Configure脚本-并且而不是config。传递目标体系结构和其他标志。(例如,出于安全原因,我更喜欢禁用ssl3(
  5. 运行make以生成库。SHLIB_VERSION_NUMBER= SHLIB_EXT=.so部分需要确保创建的二进制文件的名称中没有版本号,因为android不支持这一点

就这样!

最新更新