构建Android版Qt Base时无法找到OpenSSL等依赖库的问题
Android Qt Base 构建依赖查找失败问题排查与解决
问题描述
尝试构建Android版Qt Base,已定义环境变量并手动编译了Freetype、Harfbuzz、OpenSSL、SDL等依赖库,但构建Qt Base时持续出现CMake依赖查找错误。
环境变量定义
INSTALLDIR="$1" if [ "${INSTALLDIR:0:1}" != "/" ]; then INSTALLDIR="$PWD/$INSTALLDIR" fi # Set Android NDK and target architecture ANDROID_SDK_PATH="/home/swami/Android/Sdk/" ANDROID_NDK_PATH="/home/swami/Android/Sdk/ndk/29.0.13113456/" ANDROID_API_LEVEL=21 # Adjust this to your target API level ANDROID_ARCH="arm64-v8a" # Change this to your desired architecture (e.g., armv7a, x86, etc.) export ANDROID_SDK=$ANDROID_SDK_PATH export ANDROID_NDK=$ANDROID_NDK_PATH export ANDROID_API=$ANDROID_API_LEVEL export ANDROID_ARCH=$ANDROID_ARCH
Qt Base构建脚本
echo "Building Qt Base..." rm -fr "qtbase-everywhere-src-$QT" tar xf "qtbase-everywhere-src-$QT.tar.xz" cd "qtbase-everywhere-src-$QT" mkdir build-host cd build-host ../configure -developer-build -nomake tests -nomake examples cmake --build . --target host_tools cd .. mkdir build cd ./build # Configure Qt for Android ../configure -prefix "$INSTALLDIR" \ -release \ -android-ndk "$ANDROID_NDK" \ -android-sdk "$ANDROID_SDK" \ -android-abis "$ANDROID_ARCH" \ -qt-host-path "../build-host" \ -qt-doubleconversion \ -ssl -openssl-runtime \ -opengl es2 \ -no-dbus \ -no-xcb \ -no-gtk \ -xkbcommon \ -- -DFEATURE_dbus=OFF \ -DFEATURE_icu=OFF \ -DFEATURE_printsupport=OFF \ -DFEATURE_sql=OFF \ -DFEATURE_system_png=ON \ -DFEATURE_system_jpeg=ON \ -DFEATURE_system_zlib=ON \ -DFEATURE_system_freetype=ON \ -DFEATURE_system_harfbuzz=ON cmake --build . --parallel ninja install cd ../../
依赖库编译脚本
echo "Building Freetype..." git clone https://gitlab.freedesktop.org/freetype/freetype.git cd freetype ./autogen.sh ./configure --prefix="$INSTALLDIR" \ --host=arm-linux-androideabi \ --build=x86_64-linux-gnu \ --with-android-ndk=$ANDROID_NDK\ --with-zlib=yes \ --with-png=yes \ --with-harfbuzz=no make && make install cd .. echo "Building Harfbuzz..." git clone https://github.com/harfbuzz/harfbuzz.git cd harfbuzz cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_PATH/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_NATIVE_API_LEVEL=21 \ -DCMAKE_PREFIX_PATH="$INSTALLDIR" \ -DCMAKE_INSTALL_PREFIX="$INSTALLDIR" \ -DBUILD_SHARED_LIBS=ON \ -Dcoretext=disabled \ -Dfreetype=enabled \ -Dglib=disabled \ -B build \ -G Ninja cmake --build build --parallel ninja -C build install cd .. git clone https://github.com/openssl/openssl.git cd openssl git checkout openssl-3.2.2 ./Configure android-arm64 no-shared \ -D__ANDROID_API__=$ANDROID_API \ --prefix="$INSTALLDIR" \ --with-zlib-include="$INSTALLDIR/include" \ --with-zlib-lib="$INSTALLDIR/lib" make -j$(nproc) SHLIB_VERSION_NUMBER= SHLIB_EXT=_1_1.so build_libs make install cd .. echo "Building SDL..." rm -fr "$SDL" tar xf "$SDL.tar.gz" cd "$SDL" cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_PATH/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_NATIVE_API_LEVEL=21 \ -DCMAKE_PREFIX_PATH="$INSTALLDIR" \ -DCMAKE_INSTALL_PREFIX="$INSTALLDIR" \ -DBUILD_SHARED_LIBS=ON \ -DSDL_SHARED=ON \ -DSDL_STATIC=OFF \ -B build \ -G Ninja cmake --build build --parallel ninja -C build install cd ..
错误信息
CMake Error at cmake/QtBuildInformation.cmake:534 (message): Feature "openssl_runtime": Forcing to "ON" breaks its condition: TEST_opensslv11_headers OR TEST_opensslv30_headers Condition values dump: TEST_opensslv11_headers = "FALSE" TEST_opensslv30_headers = "FALSE" Call Stack (most recent call first): cmake/QtFeature.cmake:322 (qt_configure_add_report_error) cmake/QtFeature.cmake:442 (qt_feature_check_and_save_internal_value) cmake/QtFeature.cmake:141 (qt_evaluate_feature) cmake/QtFeature.cmake:180 (qt_internal_evaluate_config_expression) cmake/QtFeature.cmake:396 (qt_evaluate_config_expression) cmake/QtFeature.cmake:711 (qt_evaluate_feature) cmake/QtBaseGlobalTargets.cmake:109 (qt_feature_module_end) cmake/QtBaseHelpers.cmake:186 (include) CMakeLists.txt:32 (qt_internal_qtbase_build_repo) CMake Error at cmake/QtBuildInformation.cmake:534 (message): Feature "system_freetype": Forcing to "ON" breaks its condition: QT_FEATURE_freetype AND WrapSystemFreetype_FOUND Condition values dump: QT_FEATURE_freetype = "ON" WrapSystemFreetype_FOUND = "FALSE" Call Stack (most recent call first): cmake/QtFeature.cmake:322 (qt_configure_add_report_error) cmake/QtFeature.cmake:442 (qt_feature_check_and_save_internal_value) cmake/QtFeature.cmake:141 (qt_evaluate_feature) cmake/QtFeature.cmake:180 (qt_internal_evaluate_config_expression) cmake/QtFeature.cmake:396 (qt_evaluate_config_expression) cmake/QtFeature.cmake:711 (qt_evaluate_feature) cmake/QtFeature.cmake:680 (qt_feature_module_end) src/CMakeLists.txt:13 (qt_feature_evaluate_features) CMake Error at cmake/QtBuildInformation.cmake:534 (message): Feature "system_harfbuzz": Forcing to "ON" breaks its condition: QT_FEATURE_harfbuzz AND WrapSystemHarfbuzz_FOUND Condition values dump: QT_FEATURE_harfbuzz = "ON" WrapSystemHarfbuzz_FOUND = "FALSE"
解决方案
1. OpenSSL 检测失败修复
- 问题根源:Qt无法识别已编译的OpenSSL 3.2.2头文件,且
-openssl-runtime参数与静态编译的OpenSSL不匹配。 - 修复步骤:
- 将Qt configure中的
-ssl -openssl-runtime替换为-ssl -openssl-linked(因编译的是静态OpenSSL库no-shared)。 - 在configure的
--后追加CMake参数:-DOPENSSL_ROOT_DIR=$INSTALLDIR,明确指定OpenSSL路径。 - 验证
$INSTALLDIR/include/openssl下存在完整头文件,$INSTALLDIR/lib下有libcrypto.a和libssl.a。
- 将Qt configure中的
2. system_freetype 找不到修复
- 问题根源:Freetype编译时指定的
--host=arm-linux-androideabi对应32位ARM架构,与目标arm64-v8a不匹配,导致Qt无法找到64位库。 - 修复步骤:
- 重新编译Freetype,将
configure的--host参数改为aarch64-linux-android:./configure --prefix="$INSTALLDIR" \ --host=aarch64-linux-android \ --build=x86_64-linux-gnu \ --with-android-ndk=$ANDROID_NDK\ --with-zlib=yes \ --with-png=yes \ --with-harfbuzz=no - 在Qt configure的CMake参数中添加
-DFreetype_ROOT=$INSTALLDIR,帮助Qt定位库文件。
- 重新编译Freetype,将
3. system_harfbuzz 找不到修复
- 问题根源:Harfbuzz编译时未正确关联同架构的Freetype,或Qt无法自动识别Harfbuzz路径。
- 修复步骤:
- 确保Freetype已编译为arm64-v8a架构并安装到
$INSTALLDIR后,重新编译Harfbuzz。 - 在Qt configure的CMake参数中添加
-DHarfbuzz_ROOT=$INSTALLDIR。 - 验证
$INSTALLDIR/lib下存在libharfbuzz.so(或静态库),且架构为arm64-v8a。
- 确保Freetype已编译为arm64-v8a架构并安装到
通用注意事项
- 所有依赖库必须与Qt目标架构完全一致(arm64-v8a),禁止混合32位/64位库。
- 每次修改配置后,清理Qt的
build目录再重新configure,避免CMake缓存干扰。 - 确保
$INSTALLDIR路径下的include、lib目录权限正常,Qt构建进程可访问。
内容的提问来源于stack exchange,提问作者Uddhav Swami
相关产品推荐
相关产品推荐

