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

如何用CMake最好地处理数据文件?,cmake,eclipse-cdt,Cmake,Eclipse Cdt,我有一个CMake项目,其中包含代码和一些数据文件(精确地说是图像) 我的目录结构如下: src 资料 src包含源代码、数据和数据文件。CMake建议进行源代码外构建,因此当我调用make时,我有可执行程序,但没有数据文件,因此我无法执行该程序 当然,make install会将我的数据文件复制到所需的位置并使其工作,因此我现在开发如下: cmake-DCMAKE\u INSTALL\u DIR=dist 安装 dist/myprogram.exe 如果我使用命令行和编辑器,这没关系,但

我有一个CMake项目,其中包含代码和一些数据文件(精确地说是图像)

我的目录结构如下:

  • src
  • 资料
src包含源代码、数据和数据文件。CMake建议进行源代码外构建,因此当我调用make时,我有可执行程序,但没有数据文件,因此我无法执行该程序

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

  • cmake-DCMAKE\u INSTALL\u DIR=dist
  • 安装
  • dist/myprogram.exe
  • 如果我使用命令行和编辑器,这没关系,但我最近决定转向EclipseCDT。从CMake生成一个Eclipse项目效果很好,但是从Eclipse手动执行安装目标并不好

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

    应该可以解决这个问题

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

    configure_file(data_file ${CMAKE_CURRENT_BINARY_DIR}/data_file COPYONLY)
    
    这将在调用cmake时将指定的文件复制到生成目录中,因此即使在源代码外的生成中,它也可以在同一位置使用

    configure_file
    不支持目录,但命令支持:

    file(COPY assets DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
    

    如果复制文件花费太多时间(它们是图像…),您可以使用configure_文件创建一个“自定义”data_header.h,其中包含指向仍在源目录中的数据的路径,从而使复制变得更好

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

    const char* const global_testdatapath = "@Test_Data_Path@";
    
    然后在CMake中使用configure_文件:

    # 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/ )
    

    然后,我可以在我的cpp文件中包含“Global_Build_Config.h”,并引用固定路径

    您的问题有点老了,但如果您仍然感兴趣(或其他人),我有一个类似的场景,我会复制单元测试目标的测试数据:

    add_custom_command( TARGET ${UTEST_EXE_NAME}
        POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E echo "Copying unit test data.."
        COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_HOME_DIRECTORY}/utest/testdata ${CMAKE_BINARY_DIR}
        )
    

    因此,主要思想是使用一个构建后目标,并在每次构建之后执行。对我来说,数据不多,文件系统会缓存数据,所以我根本感觉不到复制过程。如果不同的话,您可能可以通过使用copy_进行复制来增强这一点。但是,在这种情况下,必须创建图像文件列表并编写循环,因为该命令基于文件。使用GLOB命令,如果需要的话,这应该不难做到。

    我必须分别为每个文件执行此操作吗?我使用
    文件(复制资产目标${CMAKE\u CURRENT\u BINARY\u DIR})
    您应该知道,这会使项目的打包更加复杂,因为对于包构建,必须再次执行cmake,更不用说您必须编写的extre cmake代码。相关:上面链接中讨论的选项之一是创建软链接,而不是复制所有资产(这可能会造成大量时间和空间浪费)。