CMake:根据架构与构建配置选择正确的库文件
解决方案
核心思路
CMake提供了对应架构和构建配置的内置变量,结合生成器表达式可以自动匹配对应路径。关键是先正确识别目标架构,再根据构建配置拼接库文件路径。
步骤1:确定目标架构
根据不同构建生成器(如Visual Studio、Makefile),设置统一的TARGET_ARCH变量:
set(TARGET_ARCH "") # 针对Visual Studio生成器,直接读取平台名称 if(CMAKE_VS_PLATFORM_NAME STREQUAL "x86") set(TARGET_ARCH "x86") elseif(CMAKE_VS_PLATFORM_NAME STREQUAL "x64") set(TARGET_ARCH "x64") else() # 针对Makefile等单架构生成器,根据处理器类型映射 if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i686|i386)$") set(TARGET_ARCH "x86") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(AMD64|x86_64)$") set(TARGET_ARCH "x64") endif() endif() # 校验架构识别结果,避免后续出错 if(NOT TARGET_ARCH) message(FATAL_ERROR "Unsupported architecture!") endif()
步骤2:配置第三方库
先设置第三方库的根目录(替换为实际路径):
set(THIRD_PARTY_LIB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/path/to/third-party-lib")
方式1:直接拼接路径链接(简单直接)
先引入头文件目录,再用生成器表达式拼接对应库路径:
# 添加头文件搜索路径 include_directories(${THIRD_PARTY_LIB_ROOT}/include) # 链接对应库文件,$<LOWER_CASE:$<CONFIG>>将构建配置转为小写,匹配目录命名 target_link_libraries(你的项目目标名 PRIVATE ${THIRD_PARTY_LIB_ROOT}/${TARGET_ARCH}-$<LOWER_CASE:$<CONFIG>>/xx.lib )
方式2:创建导入库(更规范,推荐)
通过add_library创建导入库目标,为不同配置指定对应库路径,CMake会自动匹配:
add_library(xx STATIC IMPORTED) # 设置导入库属性:不同配置对应不同库文件,头文件路径统一配置 set_target_properties(xx PROPERTIES IMPORTED_LOCATION_DEBUG "${THIRD_PARTY_LIB_ROOT}/${TARGET_ARCH}-debug/xx.lib" IMPORTED_LOCATION_RELEASE "${THIRD_PARTY_LIB_ROOT}/${TARGET_ARCH}-release/xx.lib" INTERFACE_INCLUDE_DIRECTORIES "${THIRD_PARTY_LIB_ROOT}/include" ) # 将导入库链接到你的项目目标 target_link_libraries(你的项目目标名 PRIVATE xx)
关键变量说明
CMAKE_VS_PLATFORM_NAME:Visual Studio生成器下的目标平台(x86/x64)CMAKE_SYSTEM_PROCESSOR:单架构生成器(如Makefile)下的处理器类型$<CONFIG>:生成器表达式,展开为当前构建配置(Debug/Release),单配置生成器对应CMAKE_BUILD_TYPE的值$<LOWER_CASE:...>:生成器表达式,将内容转为小写,匹配库目录的命名规则
内容的提问来源于stack exchange,提问作者brydling
相关产品推荐
相关产品推荐

