如何在CMakeLists中添加数据文件的路径?

How to add the path of data file in CMakeLists?

我有一个带有数据文件的 cmake 项目。为了执行输出文件,我需要将数据文件复制粘贴到构建目录中。项目的树结构如下所示: 在 运行 cmake 之后,输出文件存储在 /build/src/main.o 中,数据文件被复制到 /build/data/xaa.h5 中。我不想每次都复制数据文件。有没有办法让 main.o 文件访问存储在 data/xaa.h5 中的数据文件?我尝试了 file_configure,但有些地方不太正确!这是顶级 cmakelists

cmake_minimum_required(VERSION 3.1)

set(CMAKE_USER_MAKE_RULES_OVERRIDE "cmake/platform.cmake")

# C language only needed due to regression in FindHDF5.
project(H5XX LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

find_package(Boost 1.40.0 QUIET REQUIRED COMPONENTS unit_test_framework)
find_package(HDF5 COMPONENTS C REQUIRED)

include_directories(SYSTEM ${HDF5_INCLUDE_DIRS})
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
include_directories(${CMAKE_SOURCE_DIR})

set(H5XX_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/h5xx")
add_subdirectory(data)
add_subdirectory(src)

这是来自目录数据:

cmake_minimum_required(VERSION 2.8)

configure_file( xaa.h5 ${CMAKE_CURRENT_BINARY_DIR}/xaa.h5 COPYONLY)

我想从文件中读取数据然后打印出来

#include <boost/multi_array.hpp>
#include <h5xx/h5xx.hpp>
#include <iostream>

using array_2d_t = boost::multi_array<float, 2>;

template <typename T> void print_array(T const& array)
{
    for (auto const& row : array) 
        { for (auto v : row)
            printf("%5f ", v);
        printf("\n");
    }
}

array_2d_t read_frame(int frame_no) {
    h5xx::file xaa("xaa.h5", h5xx::file::mode::in);

    h5xx::group   g(xaa, "particles/lipids/box/positions");
    h5xx::dataset ds(g, "value");

    array_2d_t arr(boost::extents[11214][3]);

    std::vector<float> offsets{frame_no, 0, 0}, counts{1, 11214, 3};
    h5xx::slice slice(offsets, counts);

    h5xx::read_dataset(ds, arr, slice);
    return arr;
}

int main()
{
    print_array(read_frame(9));
}

也许您可以尝试文件 https://cmake.org/cmake/help/latest/command/file.html,而不是 file_configure.

在 cmake 中,您通常可以在构建期间或构建之前执行操作。您设置它的方式是在构建之前完成复制工作。那时 Cmake 通常不能很好地处理依赖项跟踪,并且只要 CMakeLists 或其依赖项有任何更改,文件就可能随时被复制。相反,通过将文件作为适当的目标在构建时进行复制,只有在源文件更改时才会复制。