手动通过CMake引入VCPKG后,Android编译环境变量无法访问
问题描述
- 目标:为Android编译SDL应用,使用VCPKG管理依赖
- 冲突:CLion中VCPKG原本通过
CMAKE_TOOLCHAIN_FILE变量配置,但该变量已被Gradle用于设置NDK路径,因此改为在CMakeLists.txt中直接include VCPKG的配置文件:include("C:/Users/charl/.vcpkg-clion/vcpkg/scripts/buildsystems/vcpkg.cmake") - 核心问题:VCPKG的
android.cmake工具链文件无法读取环境变量ANDROID_NDK_HOME,if(DEFINED ENV{ANDROID_NDK_HOME})始终返回false;但在主CMakeLists.txt中用message("VCPKG @: $ENV{ANDROID_NDK_HOME}")能正常输出正确路径,重启电脑也无法解决。 - 临时方案:在
android.cmake第26行后硬编码NDK路径,但不符合需求。
解决方案
方案1:通过Gradle传递环境变量给CMake进程
Gradle调用CMake时,可能未将系统环境变量完整传递,可在build.gradle中显式指定传递ANDROID_NDK_HOME:
android { defaultConfig { externalNativeBuild { cmake { // 将系统环境变量中的ANDROID_NDK_HOME传递给CMake environmentVariables "ANDROID_NDK_HOME": System.getenv("ANDROID_NDK_HOME") } } } }
方案2:在CMakeLists.txt中提前缓存NDK路径
在include VCPKG配置文件前,将环境变量中的ANDROID_NDK_HOME转为CMake缓存变量,确保工具链文件能读取到:
# 先从环境变量获取NDK路径并存入缓存 if(DEFINED ENV{ANDROID_NDK_HOME}) set(ANDROID_NDK_HOME $ENV{ANDROID_NDK_HOME} CACHE PATH "Path to Android NDK") endif() # 再include VCPKG的配置文件 include("C:/Users/charl/.vcpkg-clion/vcpkg/scripts/buildsystems/vcpkg.cmake")
方案3:修改VCPKG Triplet配置(项目级指定)
不修改通用的android.cmake工具链文件,而是在项目对应的VCPKG Triplet文件中指定NDK路径:
- 找到VCPKG的triplet目录(通常是
vcpkg/triplets) - 复制对应架构的triplet文件(比如
arm64-android.cmake)到项目目录下的triplets文件夹 - 在复制后的文件中添加:
set(VCPKG_ANDROID_NDK "C:/Users/charl/AppData/Local/Android/Sdk/ndk/27.0.12077973") - 在CMakeLists.txt中指定使用该自定义triplet:
set(VCPKG_TARGET_TRIPLET "arm64-android" CACHE STRING "")
内容的提问来源于stack exchange,提问作者TasmanianNoob
相关产品推荐
相关产品推荐

