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
相关产品推荐
相关产品推荐

