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 条评论
登录 后参与评论

相关文章

来自专栏Huramkin的归档库

好用的批量扫米工具DomainMegaBot

项目地址 https://github.com/Har-Kuun/DomainMegaBot

1131
来自专栏CodingBlock

Android插件化-RePlugin项目集成与使用

前言:前一段时间新开源了一种全面插件化的方案-- RePlugin,之前一种都在关注 DroidPlugin 并且很早也在项目中试用了,但最终没有投入到真正的生...

3940
来自专栏逸鹏说道

Jupyter ~ 像写文章般的 Coding

这次选Markdown模式(关于Markdown基础可以看之前写的Markdown Base)

843
来自专栏python爬虫日记

windows平台python 2.7环境编译安装zbarlight

类似于前一篇博文,http://www.cnblogs.com/zhongtang/p/7148082.html中描述的情况。

1582
来自专栏腾讯IVWEB团队的专栏

使用 Xposed 强制 androidwebView 开启 debug 模式

从 《远程调试 Android 设备使用入门》文章中我们可以知道在 android 4.4+可以通过在apk中使用下面的代码开启 webview 的 chrom...

6170
来自专栏吉浦迅科技

【入门篇】在Jetson TX2上跑典型CUDA例子遇到的非典型错误

作为一个嵌入式开发的小白,当你拿到Jetson TX2开发板,并且成功用Jetpack 3.0刷完板子以后(也就是说明,此时你的TX2板子上已经安装好CUDA、...

36910
来自专栏小白安全

一种深度隐蔽的后门方式

这是关于域中深度隐蔽后门系列的第二篇,第一篇为利用文件目录ACL深度隐藏后门。 本篇主要介绍利用域中主机账号的口令散列值制作白银票据,结合文...

2847
来自专栏潇涧技术专栏

Head First Stanford NLP (3)

(深入浅出Stanford NLP 可视化篇) 本文介绍与Stanford NLP相关的一些可视化工具。

671
来自专栏各种机器学习基础算法

windows环境下搭建python+nltk开发环境

nltk(Natural Language Tookit)实际上是python的一个开发包。对于自然语言处理任务非常有用。 ==================...

2686
来自专栏马洪彪

C#仪器数据文件解析-Word文件(doc、docx)

不少仪器数据报告输出为Word格式文件,同Excel文件,Word文件doc和docx的存储格式是不同的,相应的解析Word文件的方式也类似,主要有以下方式: ...

3374

扫码关注云+社区