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

CMake ExternalProject_Add显式设置SOURCE_DIR时复制时间戳文件失败

解决CMake ExternalProject自定义目录的stamp文件错误

问题根源

你遇到的错误是因为SOURCE_DIR与PREFIX路径重合,同时启用BUILD_IN_SOURCE,导致ExternalProject在生成和复制stamp文件时出现路径冲突,CMake 3.17.5对这种目录结构的兼容性有限。

解决方案

方案1:调整目录结构(推荐)

将源码目录设为PREFIX下的子目录,用绝对路径明确所有目录位置,避免路径重叠:

include(ExternalProject)
ExternalProject_Add(libserialportDL
  PREFIX      ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport
  SOURCE_DIR  ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/src
  TMP_DIR     ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/tmp
  STAMP_DIR   ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/stamp
  DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/download
  GIT_REPOSITORY git://sigrok.org/libserialport
  GIT_PROGRESS   TRUE
  GIT_TAG        21b3dfe5
  UPDATE_COMMAND "" # 禁用每次构建的更新检查
  BUILD_IN_SOURCE 1
  CONFIGURE_COMMAND bash -c "./autogen.sh && ./configure"
  BUILD_COMMAND make
  INSTALL_COMMAND ""
)

方案2:保留源码在PREFIX根目录

如果坚持要将源码放在_deps/libserialport根目录,可将辅助目录设为隐藏子目录,避免与源码文件冲突:

include(ExternalProject)
ExternalProject_Add(libserialportDL
  PREFIX      ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport
  SOURCE_DIR  ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport
  TMP_DIR     ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/.tmp
  STAMP_DIR   ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/.stamp
  DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/.download
  GIT_REPOSITORY git://sigrok.org/libserialport
  GIT_PROGRESS   TRUE
  GIT_TAG        21b3dfe5
  UPDATE_COMMAND ""
  BUILD_IN_SOURCE 1
  CONFIGURE_COMMAND bash -c "./autogen.sh && ./configure"
  BUILD_COMMAND make
  INSTALL_COMMAND ""
)

关键说明

  • 使用${CMAKE_CURRENT_BINARY_DIR}指定绝对路径,消除相对路径解析的歧义
  • 为DOWNLOAD_DIR指定独立路径,确保git克隆的临时文件不会干扰源码目录
  • 避免SOURCE_DIR与PREFIX完全重合,防止stamp文件操作时的路径冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:18:28