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

CMake设置BUILD_SHARED_LIBS无法同时生成静态与共享库如何解决

核心问题说明

你对BUILD_SHARED_LIBS配置项的作用存在理解偏差:该全局选项仅用于控制未显式指定STATIC/SHARED属性的add_library指令的默认编译模式,仅支持ON/OFF二值切换,无法实现同时生成静态、共享两种库的需求,这就是你第一段代码仅生成.so文件的原因。

规范实现方案

你当前的临时方案可以实现需求,但存在源文件需要重复编译两次的冗余问题,更高效的规范写法是借助CMake的OBJECT目标库复用编译产物,实现源文件仅编译一次,同时生成两种格式的库:

set(LIB_NAME project)
set(FILE_NAMES
    a.cc
    b.cc
    c.cc
    d.cc
)

# 第一步:将源文件编译为对象库,仅编译一次
add_library(${LIB_NAME}_obj OBJECT ${FILE_NAMES})
# 开启位置无关代码属性,保证对象可被链接到动态库
set_target_properties(${LIB_NAME}_obj PROPERTIES POSITION_INDEPENDENT_CODE ON)

# 第二步:基于编译好的对象生成静态库
add_library(${LIB_NAME} STATIC $<TARGET_OBJECTS:${LIB_NAME}_obj>)

# 第三步:基于编译好的对象生成动态库
add_library(${LIB_NAME}_shared SHARED $<TARGET_OBJECTS:${LIB_NAME}_obj>)
# 统一动态库输出名称,避免加后缀,静态库和动态库后缀不同不会冲突
set_target_properties(${LIB_NAME}_shared PROPERTIES OUTPUT_NAME ${LIB_NAME})

该方案最终会生成libproject.a静态库和libproject.so共享库,符合常规的库命名规范,编译效率也更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:36:03