CMake 3.16中如何为MODULE类型库添加类SHARED库的符号链接
解决CMake MODULE库的符号链接配置问题
我来帮你搞定这个场景下的符号链接配置,刚好之前处理过类似的需求,结合你用的CMake 3.16版本,给你分步拆解解决方案:
核心问题拆解与对应方案
1. 如何引用MODULE目标的输出文件名
CMake提供了生成表达式和目标属性查询两种方式来获取目标的输出名称,完美适配Debug/Release等不同配置:
- 用生成表达式直接获取:
$<TARGET_FILE_NAME:Dummy>—— 会返回你设置的OUTPUT_NAME_RELEASE或OUTPUT_NAME_DEBUG对应的值(比如Dummy.so.1.0.0) - 用属性查询:
get_target_property(DUMMY_OUTPUT_NAME Dummy OUTPUT_NAME_$<CONFIG>)—— 把结果存到变量里后续使用
2. 创建相对路径的符号链接
要生成相对路径的链接,关键是确保原文件的路径是相对于符号链接所在目录的路径。因为你要把链接和原库放在同一目录,所以直接用原库的文件名作为相对路径即可,不需要加任何前缀。
3. 让符号链接和模块在同一目录
不管是构建阶段(编译后生成的文件)还是安装阶段(安装到系统目录),都需要让链接的路径指向原库所在的目录:
- 构建阶段:用
$<TARGET_FILE_DIR:Dummy>获取原库的输出目录 - 安装阶段:用
${CMAKE_INSTALL_PREFIX}/somewhere(结合DESTDIR)指定安装目录
完整配置示例
构建阶段(编译后自动生成符号链接)
在你的add_library配置后添加以下代码:
add_library( Dummy MODULE Dummy.cpp ) set_target_properties( Dummy PROPERTIES PREFIX "" SUFFIX "" OUTPUT_NAME_RELEASE "Dummy.so.${PROJECT_VERSION}" OUTPUT_NAME_DEBUG "Dummy.so.${PROJECT_VERSION}" ) # 构建目录下创建相对路径的符号链接 file(CREATE_LINK $<TARGET_FILE_NAME:Dummy> # 原库的相对路径(同目录下直接用文件名) $<TARGET_FILE_DIR:Dummy>/Dummy.so # 符号链接的完整路径(和原库同目录) RESULT create_link_result SYMBOLIC ) # 可选:检查链接是否创建成功 if(NOT create_link_result STREQUAL "0") message(WARNING "Failed to create symbolic link for Dummy: ${create_link_result}") endif()
安装阶段(安装时自动生成符号链接)
在你的install(TARGETS)命令后添加安装代码,确保安装后符号链接和库文件在同一目录:
install( TARGETS Dummy LIBRARY DESTINATION somewhere ) # 安装符号链接到同一目录 install(CODE " set(ORIGINAL_FILE \"Dummy.so.${PROJECT_VERSION}\") set(LINK_FILE \"Dummy.so\") set(INSTALL_DIR \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/somewhere\") file(CREATE_LINK \${ORIGINAL_FILE} \${INSTALL_DIR}/\${LINK_FILE} RESULT create_link_result SYMBOLIC ) if(NOT create_link_result STREQUAL \"0\") message(WARNING \"Failed to create symbolic link during installation: \${create_link_result}\") endif() ")
关键细节说明
- 生成表达式
$<TARGET_FILE_NAME>和$<TARGET_FILE_DIR>会自动适配当前构建配置(Debug/Release),比手动查询属性更简洁 file(CREATE_LINK)的SYMBOLIC参数必须加上,确保创建的是软链接而非硬链接- 安装阶段的
\$ENV{DESTDIR}是为了支持包管理工具的临时安装目录,不要漏掉转义符\ - 你的CMake 3.16版本完全支持
file(CREATE_LINK)(该命令从3.14版本开始引入)
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

