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

CMake构建时无法创建models目录的问题求助

问题根源

你的问题核心是CMake阶段执行顺序冲突:

  • configure_file是在CMake配置阶段(生成Makefile等构建文件时)执行的,此时custom-test目标的make_directory命令还没运行。
  • 当configure_file("temp-model.txt" ./models COPYONLY)执行时,目标路径./models不存在,CMake会自动创建一个空文件而非目录来接收复制内容。
  • 后续构建阶段执行make_directory models时,因同名文件已存在,导致创建目录失败。
解决方案

方案1:配置阶段提前创建目录

使用file(MAKE_DIRECTORY)在CMake配置阶段直接创建目标目录,确保configure_file执行时目录已存在:

# 配置阶段创建目录,configure_file复制时无需自动生成文件
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/models ${CMAKE_CURRENT_BINARY_DIR}/logs)

add_custom_target(custom-test ALL
    # 可保留此命令,make_directory是幂等操作,重复执行不会报错
    COMMAND ${CMAKE_COMMAND} -E make_directory models logs
)

configure_file("config.json" . COPYONLY)
configure_file("temp-model.txt" ./models COPYONLY)

方案2:将复制操作移入构建阶段

把文件复制逻辑放到custom-target的COMMAND中,确保目录创建后再执行复制,完全由构建阶段控制顺序:

add_custom_target(custom-test ALL
    COMMAND ${CMAKE_COMMAND} -E make_directory models logs
    COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/config.json" .
    COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/temp-model.txt" ./models
)
补充说明
  • file(MAKE_DIRECTORY)是CMake配置阶段的命令,会在生成构建文件前创建目录,适合需要提前准备目录的场景。
  • 改用cmake -E copy替代configure_file,可以让所有操作都在构建阶段按顺序执行,避免阶段冲突。

内容的提问来源于stack exchange,提问作者reid-sutherland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:30:52