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

