如何用CMake最好地处理数据文件?
我有一个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 如果我使用命令行和编辑器,这没关系,但
- src
- 资料
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代码。相关:上面链接中讨论的选项之一是创建软链接,而不是复制所有资产(这可能会造成大量时间和空间浪费)。