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

CMake add_custom_command找不到文件:为何无法复制sample.cpp?

问题描述

项目结构

--SampleMinimal
----CMakeLists.txt
----main.cpp
----sample.cpp

CMakeLists.txt 内容

cmake_minimum_required(VERSION 3.20)
project(sample-minimal)
set(CMAKE_CXX_STANDARD 11)

add_custom_command(OUTPUT sample2.cpp
        COMMAND cp sample.cpp sample2.cpp
        DEPENDS sample.cpp)
add_executable(grpc-app-main main.cpp sample2.cpp)

构建错误信息

$ cmake --S . -B build
$ cmake --build build
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/SL/Projects/cpp/sample_minimal/build
[ 25%] Generating sample2.cpp
cp: sample.cpp: No such file or directory
make[2]: *** [sample2.cpp] Error 1
make[1]: *** [CMakeFiles/grpc-app-main.dir/all] Error 2
make: *** [all] Error 2

明明sample.cpp存在于项目中,为何add_custom_command无法找到该文件,且未像其他源文件一样复制到cmake-build-debug目录?


问题原因与解决方法

核心原因

CMake执行add_custom_command时,默认工作目录是构建目录(build),而非项目源码目录。所以命令里的cp sample.cpp sample2.cpp会在build目录下查找sample.cpp,自然找不到。

另外,CMake不会自动将源码文件复制到构建目录——只有当源码被添加为目标的编译源文件时,CMake才会处理它,而sample.cpp仅作为自定义命令的依赖,未加入可执行目标的源文件列表,因此不会被复制。

解决方法

  • 使用绝对路径引用源文件
    借助CMake内置变量CMAKE_CURRENT_SOURCE_DIR(指向当前CMakeLists.txt所在的源码目录),指定sample.cpp的完整路径:

    add_custom_command(OUTPUT sample2.cpp
            COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/sample.cpp sample2.cpp
            DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/sample.cpp)
    
  • 指定自定义命令的工作目录
    通过WORKING_DIRECTORY参数让命令在源码目录执行,同时指定输出文件到构建目录,避免污染源码目录:

    add_custom_command(OUTPUT sample2.cpp
            COMMAND cp sample.cpp ${CMAKE_CURRENT_BINARY_DIR}/sample2.cpp
            DEPENDS sample.cpp
            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:23:30