在 Windows 下通过 CMake 使用预编译的 HDF5 库

Posted

技术标签:

【中文标题】在 Windows 下通过 CMake 使用预编译的 HDF5 库【英文标题】:Using pre-compiled HDF5 libraries with CMake under Windows 【发布时间】:2019-07-01 16:09:12 【问题描述】:

我想在应该独立于平台的 CMake 项目中使用预编译的 HDF5 库。 Linux版本运行良好,Windows下不同系统出现不同问题。

问题 #1:Windows Server 2008、Visual Studio Ultimate 2012 上的问题

在这台机器上,使用 CMake 3.7.2 生成 Visual Studio 项目。这很好,安装并找到了 HDF5 库的 1.8.18 和 1.10.1 版本。问题出现在编译过程中,找不到头文件 inttypes.h。此头文件在某种程度上属于 C99 标准,某些 Visual Studio 编译器版本不支持该标准。有什么办法可以解决这个问题吗?

问题 #2:Windows 10、Visual Studio Enterprise 2017 上的问题

在这里,我安装了 HDF5 1.10.1 和 CMake 3.10 并尝试构建我的简单示例 CMake 脚本:

cmake_minimum_required(VERSION 3.2.2)
project(hdf5test)
find_package(HDF5 REQUIRED COMPONENTS C CXX NAMES hdf5)

我按照 USING_HDF5_CMake.txt 中的建议设置了 HDF5_DIR 环境变量。但无论我尝试什么,错误:

找不到与请求的版本“”兼容的包“HDF5”的配置文件。

已考虑但未接受以下配置文件: C:/Program Files/HDF_Group/HDF5/1.10.1/cmake/hdf5-config.cmake,版本:1.10.1(64位)

总是出现。现在我很困惑,看起来 CMake 是在正确的跟踪上,但由于某种原因忽略了正确的库。任何想法为什么会发生这种情况?

问题 #3:Windows 10 上的问题(更新)

我设法让代码在与 #2 相同的机器上编译。快速修复是使用 CMake 的 find_package 的模块模式(NAMES 参数激活此模式,删除此参数后我可以生成并构建 Visual Studio 解决方案。

然后,我添加了一个简短的 C++ 代码 sn-p 来创建一个 HDF5 文件:

#include "H5Cpp.h"
int main(void)

    H5::H5File file("test.hdf", H5F_ACC_TRUNC);

这段代码可以编译,但是当我运行它时,它给了我错误:

在动态链接库 [...]\hdf5_cpp.dll 中找不到过程入口点 H5Pset_virtual。

有什么想法吗?

相关:

This did not help

【问题讨论】:

我们通过将 HDF5_DIR 设置为 CMake 变量来包含 HDF5,然后使用 find_package(HDF5 COMPONENTS CXX CXX_HL NO_MODULE REQUIRED static) 链接到静态库。从更新的问题 #3 开始,路径中可能有一个较旧的 hdf5 DLL?尝试在 VS Solution Explorer->Properties->Configuration Properties->Debugging->Environment setting 中显式添加 HDF5 DLL 路径。 环境变量为HDF5_ROOT 好的,我已经尝试了几件事,但都没有成功。到目前为止我所学到的:find_package 提供了两个签名,基本模块模式和高级配置模式。在模块模式下找到了 HDF5 库,但启动时的错误仍然存​​在。在配置模式下,CMake 变量 $HDF5_LIBRARIES 未填充,我收到链接器错误。 @vre:你的命令使用了配置模式,我得到了链接器错误。 IIRC,我一直使用配置模式并使用 HDF5_DIR/FindHDF5.cmake 和 HDF5-config.cmake 中的库签名,例如$HDF5_CXX_STATIC_LIBRARY $HDF5_CXX_HL_STATIC_LIBRARY。您是否尝试使用 FindHDF5.cmake 中提到的目标名称,例如hdf5_cpp 或 hdf5 在您的情况下,在您的target_link_libraries 电话中? 【参考方案1】:

这个答案是来自 cmets 的见解的总结,以供以后参考。感谢vre 和 HDF5 论坛中的人们的贡献。

#1

这里的问题是 Windows 安装程序中的 HDF5 库被配置为假定存在某些头文件。可以调整某些定义以使其正确(参见讨论in the HDF5 forum),但干净的方法是从头开始编译 HDF5 库。

#2

这里没有解决方案。因此我切换到 CMake 的模块模式,在每个系统上都找到了 HDF5 库。

#3

PATH 变量中有另一个版本的 hdf5.dll。例如,MATLAB 和 ParaView 会导致这种行为。解决方案可能是静态链接。为了实现这一点,至少在编译时必须正确设置 PATH。也许有一个 CMake 功能可以提供链接器的绝对路径。

仍然不确定安全通过 DLL 地狱的最佳解决方案是什么。我想这是一个相当普遍的问题,但无论如何都欢迎指点。

【讨论】:

“切换到模块模式”是什么意思? find_package 有两种模式:模块和配置。请参阅find_package help 了解更多信息。

以上是关于在 Windows 下通过 CMake 使用预编译的 HDF5 库的主要内容,如果未能解决你的问题,请参考以下文章

NDK开发使用cMake方式 - 添加其他的预编译库

在 cmake 中使用预编译的 tensorflow

cmake 预编译

Windows下使用mingw+cmake编译C/C++程序

Windows下使用CMake进阶

CMake 编译器标识在 Windows 7 64 位下未知,仅无管理员权限