如何使用CMake最好地处理数据文件?

the*_*one 19 eclipse-cdt cmake

我有一个包含代码和一些数据文件的CMake项目(图像是精确的).

我的目录结构是这样的:

  • SRC
  • 数据

src包含源代码,数据包含数据文件.CMake建议在源代码构建之外,所以当我调用make时,我有可执行程序,但不是数据文件,因此我无法执行该程序.

当然,make install会将我的数据文件复制到所需的位置并使其正常工作,因此我现在就这样开发:

  1. cmake -DCMAKE_INSTALL_DIR = dist
  2. <edit source code>
  3. make install
  4. DIST/myprogram.exe

如果我正在使用命令行和编辑器,那没关系,但我最近决定转向Eclipse CDT.从CMake生成Eclipse项目效果很好,但是从Eclipse 手动执行安装目标并不是那么好.

你们是如何解决这个问题的呢?你的程序是否有一些聪明的算法来尝试找到它的数据目录,即使它不是二进制文件的位置?或者你不使用源代码构建?

fhd*_*fhd 18

configure_file 应该解决这个问题.

我的数据目录中有一个CMakeLists.txt文件,其中包含以下内容:

configure_file(data_file ${CMAKE_CURRENT_BINARY_DIR}/data_file COPYONLY)
Run Code Online (Sandbox Code Playgroud)

这会在调用cmake时将指定的文件复制到构建目录中,因此即使在源代码构建之外,它也可以在同一位置使用.

configure_file但是,当file命令执行时,它不支持目录:

file(COPY assets DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
Run Code Online (Sandbox Code Playgroud)

  • 我是否必须分别为每个文件执行此操作 (3认同)
  • 我使用`file(COPY assets DESTINATION $ {CMAKE_CURRENT_BINARY_DIR}) (2认同)

And*_*dré 11

如果复制文件需要花费太多时间(它们是图像......),您可以通过使用configure_file创建"自定义"data_header.h来实现更好的目的,该configure_file包含仍在源目录中的数据的路径.

这就是我所做的:我的源代码中有一个文件"global_build_config.h.in",包含以下内容:

const char* const global_testdatapath = "@Test_Data_Path@";
Run Code Online (Sandbox Code Playgroud)

然后在CMake中使用configure_file:

# Assume CMake knows a variable Test_Data_Path, it will be filled in automatically
# in the generated config/Global_Build_Config.h
configure_file( Global_Build_Config.h.in ${CMAKE_BINARY_DIR}/config/Global_Build_Config.h )
# The config directory should be added as a include-searchpath
include_directories( ${CMAKE_BINARY_DIR}/config/ )
Run Code Online (Sandbox Code Playgroud)

然后我可以在我的cpp文件中#include"Global_Build_Config.h"并引用固定路径.