如何使用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
相关产品推荐
相关产品推荐

