使用CMake将文件从源目录复制到二进制目录

问题描述 投票:63回答:5

我正在尝试在CLion上创建一个简单的项目。它使用CMake(我是新来的)生成Makefile来构建项目(或某种类型)

我需要的是每次运行我的代码时将一些非项目文件(某种资源文件)传输到二进制目录。

该文件包含测试数据,应用程序将其打开以读取它们。我尝试了几种方法:

  • 通过qazxsw poi qazxsw poi 看起来很好,但它只工作一次,而不是下次运行后重新复制文件。
  • 通过file(COPY ... file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt 版本 add_custom_command OUTPUT版本 add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt) 但没有人工作。

我究竟做错了什么?

cmake
5个回答
96
投票

您可以考虑将TARGETadd_custom_target(foo) add_custom_command( TARGET foo COMMAND ${CMAKE_COMMAND} copy ${CMAKE_CURRENT_BINARY_DIR}/test/input.txt ${CMAKE_SOURCE_DIR}) 选项一起使用:

configure_file

COPYONLY不同,它在输入和输出之间创建文件级依赖关系,即:

如果输入文件被修改,构建系统将重新运行CMake以重新配置文件并再次生成构建系统。


45
投票

这两个选项都有效,并针对您的构建的两个不同步骤:

  1. configure_file(<input> <output> COPYONLY) 在配置步骤中复制文件,仅在此步骤中复制。在未更改cmake配置的情况下重建项目时,将不会执行此命令。
  2. 当您想在每个构建步骤中复制文件时,file(COPY ...)是首选。

您的任务的正确版本将是:

file(COPY ...

你可以选择add_custom_commandadd_custom_command( TARGET foo POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/test/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt) PRE_BUILD你最好读的是PRE_LINK的文档吗?

关于如何使用第一个版本的示例可以在这里找到:POST_BUILD


10
投票

您尝试的第一个选项无效,原因有两个。

首先,您忘记关闭括号。

其次,add_custom_command 应该是一个目录,而不是文件名。假设您关闭了括号,该文件将最终位于名为Use CMake add_custom_command to generate source for another target的文件夹中。

要使其工作,只需将其更改为

DESTINATION

0
投票

建议的configure_file可能是最简单的解决方案。但是,如果您从构建目录手动删除该文件,它将不会重新运行copy命令。为了处理这种情况,以下内容适用于我:

input.txt

0
投票

如果您希望将文件复制到与.exe文件相同的文件夹,我建议使用file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

$主文件目录(.exe,.so.1.2,.a)。

add_custom_target(copy-test-makefile ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/input.txt)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt
                   COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt
                                                    ${CMAKE_CURRENT_BINARY_DIR}/input.txt
                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/input.txt)

在VS中,无论是调试还是发布,这个cmake脚本都会将input.txt复制到与最终exe相同的文件中。

© www.soinside.com 2019 - 2024. All rights reserved.