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

dte*_*ech 5 c++ sql ssl qt android

随着谷歌贬低GCC,Android的Qt 5.12转向远离它,转而支持Clang.这使现有的建筑指南过时,因为它们都是基于海湾合作委员会的.

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

此外,5.12推出了一个关键的Android相关错误,它几乎要求定制构建暂时合并修复.

我自己以前从未使用过Clang,而且我是那些真正喜欢只是创建应用程序的人之一,而不是经历尝试构建必需工具时经常令人难以忍受的令人沮丧的经历.

Qt on Clang将继续存在,并且5.12是一个长期支持版本,我认为详细的一步一步指导如何生成有效的Qt构建将对许多人有益.这绝对可以节省我头痛和挫折的日子,因此我愿意为第一个可重复的答案提供慷慨的赏金,以及促进问题可见性可能需要的任何奖励.

我的个人要求是SSL,MySQL和PostgreSQL支持,但欢迎使用其他功能.看起来基于Linux的指南将是最有益的格式,因为它也适用于通过MSYS的Windows.

Fel*_*lix 0

我无法回复您所有的请求,但我可以说一些关于 openssl 的事情:

首先,即使使用 Qt 5.12,如果您使用从 Qt 本身下载的官方 Android 版本(通过 Maintenancetool),那么您仍然必须使用 gcc 工具链和 openssl 1.0.2。Qt 构建需要 1.0.*,自 1.1.1 起,clang 支持才添加到 openssl。Qt 5.13 希望支持此版本的 openssl。有关更多详细信息,请参阅QTBUG-71391 。


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

这些步骤记录在他们的 github 上的NOTES.ANDROID中。这些步骤相对简单,可以归结为对 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
Run Code Online (Sandbox Code Playgroud)

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

  1. 准备一些变量:
    • TOOLCHAIN_VERSION:只是要使用的 gcc 工具链的版本(是的,这仍然是需要的,因为仍然使用一些工具,linke ranlib 等)。从 NDK v18 开始,工具链版本仍然是 4.9
    • HOST_ARCH:主机系统的架构。该示例将其设置为 linux。如果您使用的是 windows/macos,请相应地调整此项。
    • API_VERSION:openssl 应该构建的 Android SDK 版本。我将值设置为 Qt 用于构建这些平台的版本,但其他版本也应该没问题
    • ARCH_ID:openssl 使用的 android 架构的名称
    • TOOLCHAIN:要使用的 gcc 工具链的名称
  2. 确保ANDROID_NDK环境变量设置为安装 NDK 的位置
  3. 更新路径以包含特定平台的clang/llvm 工具链和gcc 工具链。在脚本中,工具链的位置源自前面的变量
  4. 显式运行Configure脚本 - 而不是 config. 传递目标架构和附加标志。(例如,出于安全原因,我更喜欢禁用 ssl3)
  5. 运行 make 来构建库。需要该SHLIB_VERSION_NUMBER= SHLIB_EXT=.so部分来确保创建的二进制文件的名称中没有版本号,因为 android 不支持这一点。

就是这样!