构建具有SSL和SQL支持的Android版Qt 5.12 LTS

时间:2018-12-09 13:59:41

标签: android c++ sql qt ssl

随着google弃用GCC,适用于Android的Qt 5.12转向了Clang而不是它。由于它们都是基于GCC的,因此使现有的建筑指南已过时。

用于Android的常规Qt构建缺少一些重要功能,此外,相关文档似乎已经过时了。

另外,5.12随critical Android related bug一起启动,该命令几乎强制要求定制构建以暂时包含此修复程序。

我本人以前根本没有使用过Clang,我是那些真正喜欢只开发应用程序而不是经历试图构建必要工具的令人沮丧的经历的人之一。

关于Clang的Qt仍然存在,并且5.12是长期支持版本,我认为详细的分步指南将指导如何制作有效的Qt版本,这将使很多人受益。这肯定会为我省去数日的头痛和挫折,因此,除了为提高问题可见度可能需要的任何赏金外,我愿意慷慨地悬赏​​第一个可重现的答案。

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

1 个答案:

答案 0 :(得分:0)

我无法答复您的所有请求,但是我可以说一些有关openssl的信息:

首先,即使使用Qt 5.12,如果您使用的是从Qt本身下载的官方android版本(通过Maintenancetool),那么您仍然必须使用gcc工具链和openssl 1.0.2。 Qt的构建需要1.0。*,而从1.1.1开始,仅对openssl添加了clang支持。 Qt 5.13有望支持此版本的openssl。有关更多详细信息,请参见QTBUG-71391


那只蜜蜂说,如果您自己交叉编译Qt for Android(或在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。如果您在窗户/ macos上,请进行相应调整。
    • API_VERSION:应该为其构建Android SDK版本openssl。我将值设置为Qt用于这些平台构建的版本,但其他版本也应该很好
    • ARCH_ID:openssl使用的android体系结构的名称
    • 工具链:要使用的gcc工具链的名称
  2. 确保将ANDROID_NDK环境变量设置为安装了NDK的任何位置
  3. 更新路径以包含特定平台的clang / llvm工具链 gcc工具链。在脚本中,工具链的位置是从先前的变量得出的
  4. 明确运行Configure脚本-并运行config。传递目标体系结构和其他标志。 (例如,出于安全原因,我更喜欢禁用ssl3)
  5. 运行make来构建库。需要SHLIB_VERSION_NUMBER= SHLIB_EXT=.so部分以确保创建的二进制文件的名称中没有版本号,因为android不支持。

就这样!