如何在CMakeLists中配置数据文件路径避免每次手动拷贝?
你当前使用configure_file未达到预期的核心原因是:你将数据文件拷贝到了/build/data目录,但你的可执行文件输出在/build/src目录,代码中硬编码的相对路径"xaa.h5"默认读取程序运行时工作目录下的文件,自然找不到对应文件。
下面提供两种可行方案:
方案1:直接访问源目录文件,无需拷贝
该方案完全不需要拷贝数据文件,直接将源目录下的文件路径通过编译宏注入到代码中:
- 修改
src目录下的CMakeLists.txt,给你的可执行目标添加编译定义(假设你的可执行目标名为main):
add_executable(main your_source_file.cpp) # 新增以下行,注入源数据文件的绝对路径 target_compile_definitions(main PRIVATE DATA_FILE_PATH="${CMAKE_SOURCE_DIR}/data/xaa.h5")
- 修改C++代码中打开HDF5文件的行,替换硬编码路径为注入的宏:
// 替换 h5xx::file xaa("xaa.h5", h5xx::file::mode::in); 为下面的代码 h5xx::file xaa(DATA_FILE_PATH, h5xx::file::mode::in);
编译后程序会直接访问源目录下的data/xaa.h5文件,无需任何拷贝操作。
方案2:保持代码不变,CMake自动拷贝文件到可执行目录
如果不想修改业务代码,仅需调整拷贝逻辑,让CMake自动将数据文件拷贝到可执行文件的输出目录:
修改data目录下的CMakeLists.txt,替换原有configure_file逻辑为以下代码(同样假设可执行目标名为main):
add_custom_command( TARGET main POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/xaa.h5 $<TARGET_FILE_DIR:main>/xaa.h5 MAIN_DEPENDENCY xaa.h5 )
该逻辑会在每次构建main目标后自动检查数据文件是否有更新,如有变更则自动拷贝到可执行文件所在目录,你直接运行编译出来的可执行文件即可正常读取文件。
注意:你提到的
main.o是编译过程产生的目标文件,并非可执行程序,你实际需要运行的是同目录下无后缀的main(Windows下为main.exe)文件。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

