CMake 3.16.3能否配置解析构建源中相对符号链接为绝对路径?
解决CMake 3.16.3复制符号链接断链问题
核心方案:批量利用file(COPY)的FOLLOW_SYMLINKS参数
CMake 3.16.3的file(COPY)命令支持FOLLOW_SYMLINKS选项,启用后会自动解析符号链接指向的实际文件,复制文件内容而非链接本身,直接避免构建目录中出现无效相对链接。如果不想逐个文件编写复制指令,可以通过以下方式批量处理:
匹配目标符号链接文件
用file(GLOB)匹配仓库中需要复制的所有相对符号链接文件(替换为你的实际路径):file(GLOB CONFIG_SYMLINKS "${CMAKE_SOURCE_DIR}/path/to/symlinks/*")若需要递归匹配子目录中的链接,可改用
file(GLOB_RECURSE)。批量复制并解析链接
用循环遍历匹配到的文件,保持原目录结构复制实际文件到构建目录:foreach(SYMLINK_FILE ${CONFIG_SYMLINKS}) # 获取文件相对于源码根目录的路径,用于保持目录结构 file(RELATIVE_PATH REL_PATH "${CMAKE_SOURCE_DIR}" "${SYMLINK_FILE}") set(DEST_DIR "${CMAKE_BINARY_DIR}/${REL_PATH}") # 自动创建目标目录(避免因目录不存在报错) get_filename_component(DEST_PARENT_DIR "${DEST_DIR}" DIRECTORY) file(MAKE_DIRECTORY "${DEST_PARENT_DIR}") # 复制文件并解析符号链接 file(COPY "${SYMLINK_FILE}" DESTINATION "${DEST_PARENT_DIR}" FOLLOW_SYMLINKS) endforeach()
替代方案:单文件快速处理(适合少量文件)
如果仅需处理个别文件,可直接用configure_file配合参数实现:
configure_file( "${CMAKE_SOURCE_DIR}/dir/symlink-file" "${CMAKE_BINARY_DIR}/dir/target-file" COPYONLY FOLLOW_SYMLINKS )
COPYONLY表示仅复制内容不做变量替换,FOLLOW_SYMLINKS负责解析链接指向的实际文件。
注意事项
- 确保
file(GLOB)的路径匹配准确,避免误复制非目标文件; - 子模块更新导致符号链接指向的文件变化时,CMake会因链接修改时间变更自动触发重新复制,无需手动干预。
内容的提问来源于stack exchange,提问作者Amadrath
相关产品推荐
相关产品推荐

