cmake 3.5:find_package(HDF5) 指定HDF5_ROOT无效问题
2017-06-08 16:17
387 查看
我们知道cmake提供了FindHDF5.cmake(位置:$cmake_root/Modules)模块用于搜索HDF5组件。
通过查看FindHDF5.cmake的源码可以知道,可以通过定义HDF5_ROOT环境变量,来指定要使用的HDF5位置。
HDF5_ROOT是个很有用的参数,当系统安装了HDF5(
原文如下:
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在执行
上面的代码中,通过
所以我尝试下载了cmake最新的3.9版本,通过查看FindHDF5.cmake源码,发现3.9版本已经解决了这个问题。所以最简单的解决办法就是升级cmake到3.9。
而且3.9版本中还做了进一步的改进,即可以在环境变量中定义HDF5_ROOT,也可以将HDF5_ROOT定义成一个cmake变量。所以开始的cmake命令又可以写成如下形式:
通过查看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
参考资料
《FindHDF5》相关文章推荐
- CMake find_package for OpenCV
- cmake - FIND_PACKAGE和INCLUDE
- 解决“指定的文件名无效或太长”的问题
- find_package与CMake如何查找链接库详解
- find_package与CMake如何查找链接库详解
- CMake 运行错误could not find CMAKE_ROOT!!!
- CMake find_package for OpenCV
- CMake如何查找链接库---find_package的使用方法
- caffe 问题集锦之使用cmake编译多GPU时,更改USE_NCCL=1无效
- 解决“无法删除 指定的文件名无效或太长”的问题
- 解决“无法删除 指定的文件名无效或太长”的问题
- 解决使用MasterPage后,Page.FindControl方法找不到指定控件的问题
- 解决 vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效
- CMake Error: Could not find CMAKE_ROOT !!!(ubuntu14.04)
- caffe 问题集锦之使用cmake编译多GPU时,更改USE_NCCL=1无效
- Cmake environmental variables: how to make find_package, find_path and find_library work
- FileProvider无法获取外置SD卡问题解决方案 | Failed to find configured root that contains
- 关于"MDRV: cannot find lrun root directory . Please check your M_LROOT"问题解决
- CMake中find_package功能演示
- Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决