cmake 3.5:find_package(HDF5) 指定HDF5_ROOT无效问题

我们知道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

参考资料

《FindHDF5》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏移动开发之家

IJKPlayer编译so支持HTTPS的踩坑历程

同志,github来过没?右转不屑 ----> https://github.com/CarGuo

973
来自专栏格子的个人博客

Vmware vSphere hypervisor 6.5 安装教程

有vmware账号的,可以直接进入绿色通道登录进行下载,如果没有,可以按照下列步骤选择性操作。

872
来自专栏美丽应用

树莓派折腾记:打造HiFi解码转盘(基于Volumio和Dac扩展板)

1572
来自专栏运维技术迷

cubieboard(树莓派)安装Ubuntu+Apache+PHP+Mysql

其实说实话,我不太喜欢Apache,我比较青睐Nginx。但是CB不太给力,装了好几次LNMP都不成功。倒也不是说Nginx不成功,而是PHP和Mysql总是出...

34312
来自专栏java架构师

storm基础系列之五---------接入数据收集系统flume

1.基本结构介绍   flume是三层架构,agent,collector,storage。每一层都可水平扩展。   其中,agent就是数据采集方;colle...

2709
来自专栏惶心 - 技术博客

使用 Chocolatey 安装基于 Python 的视频下载程序

之前在构思新项目 HXCO Get 的时候,群里的某 @XTL 就向我推荐了 Chocolatey 这个 Windows 下的包管理器。当时并没有什么用,但是后...

1463
来自专栏月色的自留地

新麦装机问题汇

1273
来自专栏张戈的专栏

HTTP加速器varnish安装小记(1)

上午共享的那个varnish 安装手册,个人看了下,有点不知所云,好吧~看来还是先安装玩玩! 苦逼公司服务器没法连外网,不能用什么 wget 或 yum 命令直...

2728
来自专栏沈唁志

Windows 10文件系统错误-2147219196亲测有效的解决办法

说实话,Windows 10 的自动更新的确是存在一定风险,有可能将有bug的新补丁直接给推送了。所以还是建议大家,不要在微软一发布补丁就给更新上,可以尝试等待...

722
来自专栏冰霜之地

给 iOS 模拟器 “安装”app 文件

刚刚接触iOS的时候,我就一直很好奇,模拟器上面能不能直接安装app呢?如果可以,我们就直接在模拟器上面聊QQ和微信了。直到昨天和朋友们聊到了这个话题,没有想到...

1042

扫码关注云+社区