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

使用VERSION和SOVERSION时如何阻止CMake生成库符号链接

保留共享库版本控制且不生成CMake符号链接的解决方案

针对Windows+exfat这类不支持符号链接的环境,同时需要保留VERSION和SOVERSION进行版本控制的场景,可通过以下CMake配置实现:

单个共享库目标配置

对每个需要控制的共享库目标,添加如下属性设置:

set_target_properties(libfoo PROPERTIES
    # 保留版本控制信息
    VERSION 1.0.0
    SOVERSION 1
    # 构建阶段不生成soname及对应的符号链接
    NO_SONAME ON
    # 安装阶段跳过符号链接安装
    NAMELINK_SKIP ON
)
  • NO_SONAME ON:告诉CMake不为共享库添加soname字段,避免在构建目录中生成libfoo.so -> libfoo.so.1这类符号链接。
  • NAMELINK_SKIP ON:确保安装时仅复制带完整版本号的库文件(如libfoo.so.1.0.0),不创建版本跳转的符号链接。
  • VERSION和SOVERSION保留不变,维持原有的版本跟踪能力。

全局配置(所有共享库生效)

如果项目中所有共享库都需要该规则,可在CMakeLists.txt开头添加全局设置:

# 全局关闭soname生成,避免构建阶段创建符号链接
set(CMAKE_SHARED_LIBRARY_NO_SONAME ON)

# 全局设置默认的版本参数(可选,也可单独为目标设置)
set(CMAKE_SHARED_LIBRARY_VERSION "1.0.0")
set(CMAKE_SHARED_LIBRARY_SOVERSION "1")

之后对每个共享库目标,只需单独设置VERSION/SOVERSION(若需不同版本),并在安装时添加NAMELINK_SKIP:

install(TARGETS libfoo
    LIBRARY DESTINATION lib
    NAMELINK_SKIP
)

注意事项

  • 若代码中dlopen调用依赖不带版本号的库名(如libfoo.so),需调整配置文件或代码,改为指向实际生成的带版本号的库文件(如libfoo.so.1.0.0)。
  • 该配置兼容CMake 3.12及以上版本,若使用旧版本CMake,需升级或针对NAMELINK_SKIP使用INSTALL(TARGETS)的NAMELINK_ONLY反向排除方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:43:53