在 Windows 下使用带有 CMake 的预编译 HDF5 库
Using pre-compiled HDF5 libraries with CMake under Windows
我想在应该独立于平台的 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 环境变量。但无论我尝试什么,错误:
Could not find a configuration file for package "HDF5" that is compatible with requested version "".
The following configuration files were considered but not accepted:
C:/Program Files/HDF_Group/HDF5/1.10.1/cmake/hdf5-config.cmake, version: 1.10.1 (64bit)
总是出现。现在我很困惑,看起来 CMake 在正确的跟踪上,但由于某种原因忽略了正确的库。知道为什么会这样吗?
问题 #3:关于 Windows 10(更新)的问题
我以某种方式设法让代码在与 #2 相同的机器上编译。快速修复是使用 CMake 的 find_package 模块模式(NAMES 参数激活此模式,删除此参数后我可以生成并构建 Visual Studio 解决方案。
然后,我添加了一个创建 HDF5 文件的简短 C++ 代码片段:
#include "H5Cpp.h"
int main(void)
{
H5::H5File file("test.hdf", H5F_ACC_TRUNC);
}
这段代码可以编译,但是当我运行它时,它给我错误:
The procedure entry point H5Pset_virtual could not be located in the dynamic link library [...]\hdf5_cpp.dll.
有什么想法吗?
相关:
本回答是对评论的见解总结,供以后参考。感谢 vre 和 HDF5 论坛中的人们的贡献。
#1
这里的问题是 Windows 安装程序中的 HDF5 库被配置为假定存在某些头文件。可以调整某些定义使其正确(参见讨论 in the HDF5 forum),但干净的方法是从头开始编译 HDF5 库。
#2
这里没有解决方案。因此我切换到CMake的模块模式,它在每个系统上都找到了HDF5库。
#3
PATH 变量中有另一个版本的 hdf5.dll。例如,MATLAB 和 ParaView 会导致此类行为。解决方案可能是静态链接。要实现这一点,至少在编译时必须获得正确的 PATH。也许有一个 CMake 功能可以提供链接器的绝对路径。
仍然不确定安全通过 DLL 地狱的最佳解决方案是什么。我想这是一个相当普遍的问题,但无论如何欢迎指点。
我想在应该独立于平台的 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 环境变量。但无论我尝试什么,错误:
Could not find a configuration file for package "HDF5" that is compatible with requested version "".
The following configuration files were considered but not accepted: C:/Program Files/HDF_Group/HDF5/1.10.1/cmake/hdf5-config.cmake, version: 1.10.1 (64bit)
总是出现。现在我很困惑,看起来 CMake 在正确的跟踪上,但由于某种原因忽略了正确的库。知道为什么会这样吗?
问题 #3:关于 Windows 10(更新)的问题
我以某种方式设法让代码在与 #2 相同的机器上编译。快速修复是使用 CMake 的 find_package 模块模式(NAMES 参数激活此模式,删除此参数后我可以生成并构建 Visual Studio 解决方案。
然后,我添加了一个创建 HDF5 文件的简短 C++ 代码片段:
#include "H5Cpp.h"
int main(void)
{
H5::H5File file("test.hdf", H5F_ACC_TRUNC);
}
这段代码可以编译,但是当我运行它时,它给我错误:
The procedure entry point H5Pset_virtual could not be located in the dynamic link library [...]\hdf5_cpp.dll.
有什么想法吗?
相关:
本回答是对评论的见解总结,供以后参考。感谢 vre 和 HDF5 论坛中的人们的贡献。
#1
这里的问题是 Windows 安装程序中的 HDF5 库被配置为假定存在某些头文件。可以调整某些定义使其正确(参见讨论 in the HDF5 forum),但干净的方法是从头开始编译 HDF5 库。
#2
这里没有解决方案。因此我切换到CMake的模块模式,它在每个系统上都找到了HDF5库。
#3
PATH 变量中有另一个版本的 hdf5.dll。例如,MATLAB 和 ParaView 会导致此类行为。解决方案可能是静态链接。要实现这一点,至少在编译时必须获得正确的 PATH。也许有一个 CMake 功能可以提供链接器的绝对路径。
仍然不确定安全通过 DLL 地狱的最佳解决方案是什么。我想这是一个相当普遍的问题,但无论如何欢迎指点。