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

