首页 > 解决方案 > 如何在 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));
}

标签: cmake

解决方案


在 cmake 中,您通常可以在构建期间或构建之前做一些事情。您设置它的方式是在构建之前完成复制工作。Cmake 在那个时候通常不能很好地处理依赖跟踪,并且文件可能会在任何时候对其依赖项CMakeLists或其依赖项发生任何更改时被复制。相反,通过将文件作为适当的目标在构建时进行复制,仅当源文件更改时才会复制。


推荐阅读