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

