cmake - 如何在 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 在那个时候通常不能很好地处理依赖跟踪,并且文件可能会在任何时候对其依赖项CMakeLists
或其依赖项发生任何更改时被复制。相反,通过将文件作为适当的目标在构建时进行复制,仅当源文件更改时才会复制。
推荐阅读
- java - 当广播接收器收到消息时,在 recyclerview 更新切换按钮
- html - 我想让 Rule msg 动态 VueJS
- r - 构面中的重要性注释
- java - 复制/粘贴的弹出菜单未以全尺寸显示
- spring - 在 Spring 项目的 jenkins 作业中,在 applicationContext.xml 中注入一个变量
- python - 字典值不会保持不变
- json - PostgreSQL:如何从 GROUP BY ROLLUP 数据生成 JSON
- android - .so 模块中定义的文件不会成为最终 APK 的一部分
- reactjs - React Route v4 和 PrivateRoute 给出错误 - React.createElement: type is invalid
- asp.net-mvc - 在 ASP.NET MVC 5 应用程序中,如果用户尝试在未登录的情况下访问安全页面,如何强制用户登录