【问题标题】:Building Qt 5.12 LTS for Android with SSL and SQL support使用 SSL 和 SQL 支持为 Android 构建 Qt 5.12 LTS
【发布时间】:2019-05-10 14:40:03
【问题描述】:

随着 google 弃用 GCC,Android 的 Qt 5.12 进行了过渡,转而支持 Clang。这使得现有的建筑指南过时了,因为它们都是基于 GCC 的。

用于 Android 的库存 Qt 构建缺少一些重要功能,此外,相关文档似乎相当过时。

此外,5.12 发布时带有 critical Android related bug,这几乎要求自定义构建暂时包含修复。

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

Qt on Clang 将继续存在,并且 5.12 是一个长期支持版本,我认为详细的分步指南如何生成一个有效的 Qt 版本将对很多人有益。这肯定会让我免于头疼和挫折,因此我愿意为第一个可重现的答案提供慷慨的赏金,除了提高问题可见性可能需要的任何赏金。

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

【问题讨论】:

标签: android c++ sql qt ssl


【解决方案1】:

我无法回复你的所有请求,但我可以谈谈 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


也就是说,如果你自己交叉编译Qt for Android(或者以后访问这个帖子,当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

在这个脚本中,ANDROID_TARGET_ARCH 就是同名的 qmake 变量的值,所以这个脚本可以被 qmake 调用。详细需要做的步骤是:

  1. 准备一些变量:
    • TOOLCHAIN_VERSION:只是要使用的 gcc 工具链的版本(是的,这仍然是必需的,因为一些工具,linke ranlib 等仍然从那里使用)。从 NDK v18 开始,工具链版本仍然是 4.9
    • HOST_ARCH:主机系统的架构。该示例将其设置为 linux。如果您使用的是 window/macos,请相应地进行调整。
    • API_VERSION:应构建的 Android SDK 版本 openssl。我将值设置为 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 不支持。

就是这样!

【讨论】:

  • 谢谢,我会试一试的。也许我们将能够通过来自多个用户的输入来满足所有要求。
猜你喜欢
  • 2017-09-06
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
相关资源
最近更新 更多