使用CMake复制文件至构建目录:VS Code与Visual Studio通用方案
适配多环境的CMake脚本解决方案
核心思路
利用CMake的生成器表达式自动适配不同构建系统的输出目录,避免硬编码路径。关键是使用$<TARGET_FILE_DIR:PyRun>获取可执行文件的实际输出目录,这个表达式会根据生成器(Visual Studio、Ninja、Makefile等)自动解析出正确的路径。
完整CMakeLists.txt示例
cmake_minimum_required(VERSION 3.15) project(PyRun) # 定义可执行目标 add_executable(PyRun foo.cpp) # 复制script.py到可执行文件所在目录 add_custom_command( TARGET PyRun POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/script.py" "$<TARGET_FILE_DIR:PyRun>/script.py" COMMENT "Copying script.py to executable directory..." )
关键部分解释
$<TARGET_FILE_DIR:PyRun>:生成器表达式,构建时会动态替换为PyRun可执行文件的实际输出目录。不管是Visual Studio的Debug/Release子目录、VS Code用Ninja时的$<CONFIG>目录,还是Linux下的构建根目录,都能准确匹配。copy_if_different:仅当源文件script.py比目标文件新,或目标文件不存在时才执行复制,避免不必要的重复操作。POST_BUILD:确保复制操作在可执行文件构建完成后执行,保证目标目录已经存在。
验证适配性
- Visual Studio:生成器自动将可执行文件放在
${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>,$<TARGET_FILE_DIR>会正确指向该路径,复制操作正常生效。 - VS Code(Ninja生成器):多配置模式下输出目录为
${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>,表达式自动适配;单配置模式下直接指向构建根目录,依然有效。 - Linux(Makefile生成器):可执行文件默认输出在构建目录根(或指定子目录),
$<TARGET_FILE_DIR>会准确指向该位置,无需额外调整。
内容的提问来源于stack exchange,提问作者ChrCury78
相关产品推荐
相关产品推荐

