You need to enable JavaScript to run this app. 如何使用CMake为iOS、iOS模拟器及Android平台链接预编译库
优惠活动
大模型
产品
解决方案
定价
更多

如何使用CMake为iOS、iOS模拟器及Android平台链接预编译库

跨平台预编译库自动匹配CMake解决方案

核心实现思路

  • 利用CMake内置变量及工具链暴露的平台/架构参数,自动拼接对应预编译库路径,无需手动修改代码切换
  • 针对iOS多架构场景,通过Xcode的配置属性分别关联真机、模拟器对应的静态库,支持合并架构编译

步骤1:统一配置基础路径与头文件

先固定预编译库的根路径,统一引入头文件目录:

set(EXAMPLE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/lib/EXAMPLE")
# 全局引入头文件路径,也可以针对目标单独配置
target_include_directories(${PROJECT_NAME} PUBLIC "${EXAMPLE_ROOT}/include")

步骤2:自动匹配平台与架构路径

根据不同平台的参数变量,自动生成对应库路径:

if(ANDROID)
    # NDK工具链自带ANDROID_ABI变量,直接对应目录结构中的ABI名称
    set(EXAMPLE_LIB_DIR "${EXAMPLE_ROOT}/lib/Android_Static_All/${ANDROID_ABI}")
elseif(IOS)
    # 适配ios-cmake工具链的架构判断
    if(PLATFORM STREQUAL "OS64COMBINED")
        # 合并编译真机+模拟器时,分别定义两个路径后续配置
        set(EXAMPLE_LIB_IPHONEOS "${EXAMPLE_ROOT}/lib/iOS64/Release-iphoneos")
        set(EXAMPLE_LIB_SIMULATOR "${EXAMPLE_ROOT}/lib/iOS64/Release-iphonesimulator")
    else()
        # 单架构编译时根据SDK类型匹配
        if(CMAKE_OSX_SYSROOT STREQUAL "iphoneos")
            set(EXAMPLE_LIB_DIR "${EXAMPLE_ROOT}/lib/iOS64/Release-iphoneos")
        else()
            set(EXAMPLE_LIB_DIR "${EXAMPLE_ROOT}/lib/iOS64/Release-iphonesimulator")
        endif()
    endif()
elseif(WIN32)
    # 根据指针长度判断x86/x64
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(EXAMPLE_LIB_DIR "${EXAMPLE_ROOT}/lib/Windows/x64")
    else()
        set(EXAMPLE_LIB_DIR "${EXAMPLE_ROOT}/lib/Windows/x86")
    endif()
elseif(UNIX AND NOT APPLE)
    # Linux平台
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(EXAMPLE_LIB_DIR "${EXAMPLE_ROOT}/lib/Linux/x64")
    else()
        set(EXAMPLE_LIB_DIR "${EXAMPLE_ROOT}/lib/Linux/x86")
    endif()
elseif(APPLE AND NOT IOS)
    # macOS平台
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(EXAMPLE_LIB_DIR "${EXAMPLE_ROOT}/lib/osX/x64")
    else()
        set(EXAMPLE_LIB_DIR "${EXAMPLE_ROOT}/lib/osX/x86")
    endif()
endif()

步骤3:配置库链接规则

针对普通平台和iOS合并架构场景分别处理:

# 先创建导入目标方便管理
add_library(EXAMPLE_API STATIC IMPORTED GLOBAL)

if(IOS AND PLATFORM STREQUAL "OS64COMBINED")
    # 合并编译场景分别给真机、模拟器设置对应的库路径
    set_target_properties(EXAMPLE_API PROPERTIES
        IMPORTED_LOCATION_RELEASE "${EXAMPLE_LIB_IPHONEOS}/libEXAMPLE_API.a"
        IMPORTED_LOCATION_RELEASE_IPHONESIMULATOR "${EXAMPLE_LIB_SIMULATOR}/libEXAMPLE_API.a"
    )
    # 添加两个路径到链接搜索目录
    target_link_directories(${PROJECT_NAME} PUBLIC ${EXAMPLE_LIB_IPHONEOS} ${EXAMPLE_LIB_SIMULATOR})
else()
    # 普通单架构场景直接设置库路径
    find_library(EXAMPLE_API_LIBRARY 
        NAMES EXAMPLE_API libEXAMPLE_API
        HINTS ${EXAMPLE_LIB_DIR}
        NO_DEFAULT_PATH
    )
    set_target_properties(EXAMPLE_API PROPERTIES IMPORTED_LOCATION ${EXAMPLE_API_LIBRARY})
endif()

# 链接目标库
target_link_libraries(${PROJECT_NAME} EXAMPLE_API)

构建使用说明

  • iOS构建无需修改CMake代码,直接使用原命令即可同时支持真机、模拟器架构编译
  • Android构建时通过NDK工具链传入-DANDROID_ABI=arm64-v8a等参数即可自动匹配对应ABI的库
  • 其他平台正常执行CMake配置命令即可自动匹配对应架构的库

内容的提问来源于stack exchange,提问作者Davide Maggioni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 08:27:02