windows下使用CMake对hdf5 的安装与测试

1.win10 的安装:

1.1参考网站:

  1. 参考1
  2. 参考2
  3. 参考3

1.2安装过程

1.2.1 下载

  • 一共下载了两个版本(1.8.211.10.5,其中1.10.5是选择的CMake Versions)的hdf5,每个版本均下载了2个压缩包(.zip和.tar.gz,其实只要下其中一个就可以),放在这里
  • 最后选择安装1.10.5,解压CMake-hdf5-1.10.5.zip。

1.2.2 安装过程

主要参考的这里这里,使用的CMake安装包,当时的CMake是3.14版本。过程如下:

  1. 前期准备

    • 下载并解压CMake-hdf5-1.10.5.zip;
    • 解压 SZip.tar.gz 和 ZLib.tar.gz
    • CMake卸载更新到3.14版本(因为要求最低版本是3.10),安装后重启电脑;
    • 目录中不能有空格和中文,会导致安装失败;
    • (可选项)安装NSIS(用于生成.exe)或者WiX(用于生成.msi),最后自己在执行.bat过程中安装了NSIS,但最后好像没有生成.exe,但是不影响;
  2. 开始编辑构建

    • 命令行中进入解压后的文件夹(.bat所在文件夹);
    • 在命令行中执行 build-VS2013-64.bat (直接拖动到命令行即可),因为本破船是64位win10,常用vs2013,所以选择了这个;如果后面还要32位的,同理操作build-VS2013-32.bat即可
    • 在命令行中执行的结果如下面3图,这个过程还是需要一些时间。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  3. 编辑结果

    • 多了一个build文件夹和一个HDF5-1.10.5-win64.zip文件,如果提前安装了NSIS,应该是还有一个HDF5-1.10.5-win64.exe文件,我这里没有.exe文件但不影响使用,结果如下图;
      在这里插入图片描述
    • 解压HDF5-1.10.5-win64.zip文件,可得到如下图的文件夹,所有的头文件和依赖库都在里面了;
      在这里插入图片描述
  4. 配置

    • 系统环境变量:将HDF5安装目录下的bin文件夹地址添加到系统的PATH变量中,这里是将E:\software_install\hdf5\1.10.5\CMake-hdf5-1.10.5\HDF5-1.10.5-win64\bin添加到PATH中去;
    • visual studio 2013 的配置(最后的配置文件在这里):
      • 附加包含目录中添加E:\software_install\hdf5\1.10.5\CMake-hdf5-1.10.5\HDF5-1.10.5-win64\include
      • 附加库目录中添加E:\software_install\hdf5\1.10.5\CMake-hdf5-1.10.5\HDF5-1.10.5-win64\lib
      • 附加依赖项中一共有2种添加方式(不能同时将两者的.lib添加进去,否则出现过定义问题):
        • a.动态链接方式: 在附加依赖项加入szip.lib;zlib.lib;hdf5.lib;hdf5_cpp.lib,还需要在[通用属性]->[C/C++]->[预处理器]中添加H5_BUILT_AS_DYNAMIC_LIB,如果不加就会出现以下问题;
        1>test.obj : error LNK2001: 无法解析的外部符号 H5T_STD_I32LE_g
        1>test.obj : error LNK2001: 无法解析的外部符号 H5T_NATIVE_INT_g
        
        • b.静态链接方式: 在附加依赖项加入libszip.lib;libzlib.lib;libhdf5.lib;libhdf5_cpp.lib千万不要再在[通用属性]->[C/C++]->[预处理器]中添加H5_BUILT_AS_DYNAMIC_LIB,否则也会出现问题:error LNK2019: 无法解析的外部符号 __imp_H5open,该符号在函数 main 中被引用
  5. debug问题
    测试代码如下:

#include <hdf5.h>
int main(){
	// hid_t是HDF5对象id通用数据类型,每个id标志一个HDF5对象
	hid_t file_id;
	// herr_t是HDF5报错和状态的通用数据类型
	herr_t status;
	// 文件id = H5Fcreate(const char *文件名,
	//                   unsigned 是否覆盖的flags,
	//                     - H5F_ACC_TRUNC->能覆盖
	//                     - H5F_ACC_EXCL->不能覆盖,报错
	//                   hid_t 建立性质,hid_t 访问性质);
	file_id = H5Fcreate("file.h5", H5F_ACC_TRUNC,
		H5P_DEFAULT, H5P_DEFAULT);
	status = H5Fclose(file_id);

	// 打开刚建立的HDF文件并关闭
	// 文件id = H5Fopen(const char *文件名, 
	//                  unsigned 读写flags,
	//                    - H5F_ACC_RDWR可读写
	//                    - H5F_ACC_RDONLY只读 
	//                  hid_t 访问性质)
	hid_t file_open_id;
	file_open_id = H5Fopen("file.h5", H5F_ACC_RDWR, H5P_DEFAULT);
	status = H5Fclose(file_open_id);

	return 0;
}

1.当使用动态链接库的方式时(静态的没事),出现问题如下: 头文件(1.10.5)和动态库(1.10.2)的版本没有对应上,猜测可能的原因为:1、之前在anaconda中安装过hdf5,可能和现在的版本不对应;2、之前安装pcl库,这个库要调用vtk库和flann库,这两个库中好像也有hdf5的动态库,所以系统自动匹配到那里去了;解决方法: 参考博客,对项目的动态库静态加载时指定动态库位置,在属性页 -> 通用属性 -> 调试 -> 环境中加入path=E:\software_install\hdf5\1.10.5\CMake-hdf5-1.10.5\HDF5-1.10.5-win64\bin;$(Path),用来指定动态库在hdf5的动态库bin中寻找;

	Warning! ***HDF5 library version mismatched error***
	The HDF5 header files used to compile this application do not match
	the version used by the HDF5 library to which this application is linked.
	Data corruption or segmentation faults may occur if the application continues.
	This can happen when an application was compiled by one version of HDF5 but
	linked with a different version of static or shared HDF5 library.
	You should recompile the application or check your shared library related
	settings such as 'LD_LIBRARY_PATH'.
	You can, at your own risk, disable this warning by setting the environment
	variable 'HDF5_DISABLE_VERSION_CHECK' to a value of '1'.
	Setting it to 2 or higher will suppress the warning messages totally.
	Headers are 1.10.5, library is 1.10.2
	```
  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值