You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake中如何实现静态、共享及对象库的可选构建?

CMake实现静态库/共享库/对象库的灵活切换

不需要为每个库目标编写冗长的if/elseif/else分支结构,通过自定义选项+封装宏的方式就能实现一键切换,具体操作如下:

1. 添加自定义库类型选择选项

先定义一个可配置选项,让用户在构建时指定库类型,同时限制可选值避免非法输入:

# 自定义库类型选择选项,默认构建静态库
set(BUILD_LIB_TYPE "STATIC" CACHE STRING "选择要构建的库类型:STATIC、SHARED 或 OBJECT")
# 限定可选值,确保用户仅能从三个合法选项中选择
set_property(CACHE BUILD_LIB_TYPE PROPERTY STRINGS "STATIC" "SHARED" "OBJECT")

# 验证输入合法性,非法值直接终止构建
if(NOT BUILD_LIB_TYPE MATCHES "^(STATIC|SHARED|OBJECT)$")
  message(FATAL_ERROR "无效的BUILD_LIB_TYPE值:${BUILD_LIB_TYPE}。必须是STATIC、SHARED或OBJECT中的一个。")
endif()

2. 封装通用的库创建宏

把库创建逻辑封装成宏,所有库目标都能复用这段逻辑,无需重复编写分支:

# 封装宏:自动适配指定类型创建库目标
macro(add_configurable_lib target_name)
  add_library(${target_name} ${BUILD_LIB_TYPE} ${ARGN})
  
  # 如果是对象库,开启位置无关代码,方便后续链接为共享库
  if(BUILD_LIB_TYPE STREQUAL "OBJECT")
    set_target_properties(${target_name} PROPERTIES POSITION_INDEPENDENT_CODE ON)
  endif()
endmacro()

3. 快速创建库目标

使用封装好的宏创建库目标,只需传入目标名和源文件即可:

# 创建名为my_utils的库,自动适配BUILD_LIB_TYPE指定的类型
add_configurable_lib(my_utils src/utils.cpp src/helper.cpp)

# 另一个库目标,复用宏逻辑无需额外修改
add_configurable_lib(my_network src/network_client.cpp src/network_server.cpp)

兼容BUILD_SHARED_LIBS(可选)

如果需要兼容CMake原生的BUILD_SHARED_LIBS选项,可以添加兼容逻辑,让BUILD_LIB_TYPE默认值跟随BUILD_SHARED_LIBS的设置:

# 兼容原生BUILD_SHARED_LIBS选项
if(NOT DEFINED BUILD_LIB_TYPE)
  if(BUILD_SHARED_LIBS)
    set(BUILD_LIB_TYPE "SHARED" CACHE STRING "选择要构建的库类型:STATIC、SHARED 或 OBJECT" FORCE)
  else()
    set(BUILD_LIB_TYPE "STATIC" CACHE STRING "选择要构建的库类型:STATIC、SHARED 或 OBJECT" FORCE)
  endif()
endif()

通过这种方式,只需修改BUILD_LIB_TYPE的值就能一键切换所有库的类型,无需逐个修改目标定义,维护效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:50:21