我们知道cmake提供了FindHDF5.cmake(位置:$cmake_root/Modules)模块用于搜索HDF5组件。
通过查看FindHDF5.cmake的源码可以知道,可以通过定义HDF5_ROOT环境变量,来指定要使用的HDF5位置。
HDF5_ROOT是个很有用的参数,当系统安装了HDF5(/usr下),而自己又编译一个版本(比如在/home下),如果想使用自己编译的版本,就可以通过这个参数来实现,避免在执行find_package(HDF5)时cmake自做聪明的找到系统安装的版本。
原文如下:
To provide the module with a hint about where to find your HDF5
installation, you can set the environment variable HDF5_ROOT. The
Find module will then look in this path when searching for HDF5
executables, paths, and libraries.
@FindHDF5.cmake
然而理想很丰满,现实很骨感,当我使用HDF5_ROOT来指定HDF5安装位置时,cmake在执行find_package(HDF5)却并没有找到我编译的版本,还是找到了/usr下安装的版本,调用代码下如:
export HDF5_ROOT=$hdf5_install_folder
cmake . $CMAKE_VARS_DEFINE -G "Unix Makefiles"
#问题溯源
最终找到了原因:cmake 3.5(我没有一个个版本去试,至少这个3.1,3.5是有问题的)以前的版本中的FindHDF5.cmake有bug,进一步的原因是对HDF5_ROOT环境变量的用法错误,造成HDF5_ROOT无效,下面这是FindHDF5.cmake其中一段代码:
find_program( HDF5_C_COMPILER_EXECUTABLE
NAMES h5cc h5pcc
HINTS ENV HDF5_ROOT
PATH_SUFFIXES bin Bin
DOC "HDF5 Wrapper compiler. Used only to detect HDF5 compile flags." )
上面的代码中,通过ENV HDF5_ROOT这样的写法来引用一个环境变量,这显然是错误的。正确的写法应该是$ENV{HDF5_ROOT}。
#解决办法
知道问题原因了,如何解决呢?修改FindHDF5.cmake源码当然是个办法,但太耗费精力了。
所以我尝试下载了cmake最新的3.9版本,通过查看FindHDF5.cmake源码,发现3.9版本已经解决了这个问题。所以最简单的解决办法就是升级cmake到3.9。
而且3.9版本中还做了进一步的改进,即可以在环境变量中定义HDF5_ROOT,也可以将HDF5_ROOT定义成一个cmake变量。所以开始的cmake命令又可以写成如下形式:
cmake . $CMAKE_VARS_DEFINE -G "Unix Makefiles" -DHDF5_ROOT=$hdf5_install_folder
#参考资料

本文介绍了一个关于CMake中FindHDF5.cmake模块的问题:即使设置了HDF5_ROOT环境变量,CMake仍可能无法正确找到指定的HDF5安装路径。文中详细解释了问题的原因在于对HDF5_ROOT环境变量的不正确引用,并提供了通过升级CMake版本到3.9来解决该问题的方法。
1267

被折叠的 条评论
为什么被折叠?



