在Visual Studio 2013和Visual C++ 2013上使用HDF5入门

5
我正在尝试在Visual Studio 2013(C ++)中使用HDF5示例,但遇到了困难。
示例代码可以在这里找到:http://www.hdfgroup.org/ftp/HDF5/examples/misc-examples/stratt.cpp ,我也将代码完整地贴在下面。
我的第一个问题是:最新的HDF5(版本1.8.13)是否能与Visual C++ 2013一起使用?文档中只提到了2012年,但是通常情况下,在文档中提到2012年的地方,我使用2013年并没有出现问题。
我尝试将示例程序作为32位和64位应用程序运行。我最终希望使用64位。对于32位的项目设置,在VC ++设置下,我添加了包含目录:C:\Program Files (x86)\HDF_Group\HDF5\1.8.13\include。对于库目录,我添加了:C:\Program Files (x86)\HDF_Group\HDF5\1.8.13\lib。
对于链接器->输入,我添加了:hdf5.lib; hdf5_cpp.lib。当我运行时,我收到了消息:“程序无法启动,因为计算机上缺少hdf5.dll...”这不出乎意料。所以我从目录C:\Program Files (x86)\HDF_Group\HDF5\1.8.13\bin中添加了hdf5.dll和hdf5_cpp.dll到调试目录。
然后我得到了运行时错误:“应用程序无法正常启动(0xc000007b)。单击“确定”关闭应用程序。 有什么想法吗?
顺便说一句,当我尝试使用64位设置、目录和文件运行x64位版本时,会出现略有不同的错误。程序一直到最后都在运行,但控制台没有写入任何属性,没有生成文件,并且在最后(在按下最后一行上的f10之后)出现了可怕的错误:
Unhandled exception at 0x000007FEF05E512D (msvcp120d.dll) in HDF5AttributeExample2.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF。
在这两种情况下(32位和64位),我的直觉告诉我,我有某种配置问题(错误的lib、错误的设置等)。如果有人能提供任何帮助或建议,我将不胜感激。
如果有其他Visual C++ HDF5示例,请务必告诉我!
谢谢,
戴夫
#include <string>
#include <iostream>

#include "H5Cpp.h"

using std::cout;
using std::endl;

using namespace H5;

const H5std_string FILE_NAME("string_test.h5");
 const H5std_string DS_NAME("Data Set 1");
const H5std_string ATTR_NAME("String Attribute");

int main(void) {

// Create the named file
H5File file = H5File(FILE_NAME, H5F_ACC_TRUNC);

// Create new dataspace for the dataset
const int rank = 3;
const int dim1 = 2;
const int dim2 = 2;
const int dim3 = 2;
hsize_t  dims[rank] = { dim1, dim2, dim3 };
DataSpace dataspace = DataSpace(rank, dims);

// Create new datatype for the dataset
FloatType datatype(PredType::NATIVE_FLOAT);

// Create the dataset
DataSet dataset = file.createDataSet(DS_NAME, datatype, dataspace);

// Set up write buffer 'matrix'
int q, r, s;
float value;
float matrix[dim1][dim2][dim3];
for (q = 0; q < dim1; q++)
for (r = 0; r < dim2; r++)
for (s = 0; s < dim3; s++)
{
    value = 1.111 + (q * r * s);
    matrix[q][r][s] = value;
}

// Write data to the dataset
dataset.write(matrix, datatype);

// Create new dataspace for attribute
DataSpace attr_dataspace = DataSpace(H5S_SCALAR);

// Create new string datatype for attribute
StrType strdatatype(PredType::C_S1, 256); // of length 256 characters

// Set up write buffer for attribute
const H5std_string strwritebuf("This attribute is of type StrType");

// Create attribute and write to it
Attribute myatt_in = dataset.createAttribute(ATTR_NAME, strdatatype, attr_dataspace);
myatt_in.write(strdatatype, strwritebuf);

// Set up read buffer for attribute
H5std_string strreadbuf("");

// Open attribute and read its contents
Attribute myatt_out = dataset.openAttribute(ATTR_NAME);
myatt_out.read(strdatatype, strreadbuf);

// Display attribute contents
cout << "Attribute contents: " << strreadbuf << endl;

return 0;
}
2个回答

6
您遇到的运行时错误是由于您使用了使用VS2012编译的库所致。
来自HDF Group 网站关于VisualStudio和CMake:
首先,请确保您使用与创建预构建二进制文件所使用的Visual Studio版本相同。这是为了避免运行时错误。
我建议您尝试使用CMake在VS2013上构建源代码。

好的,经过我自己的尝试,我成功地将它编译到了VS2013 Ultimate,并且支持32位和64位。

  • 下载源代码并解压。假设目录名为“source”。
  • 下载CMake并打开GUI,选择源位置和一个“构建”位置。
  • 单击“Configure”并选择您正在使用的Visual Studio版本。
  • 配置选项将在CMake上以红色显示。选择您需要的任何内容。
  • 单击生成。
  • 转到“build”文件夹并打开生成的MSVS解决方案。构建解决方案。
  • 在同一构建文件夹中运行命令“cpack -C {Debug | Release} ---config C:\...\"build"\CPackConfig.cmake。这将为文件创建安装程序。
  • 运行此安装程序。
  • 在MSVS中创建一个空项目。转到项目配置属性。然后选择C/C++->常规->附加包含目录并插入C:\Program Files (x86)\HDF_Group\HDF5\1.8.13\include。根据需要更改此路径。如果您使用的是x64版本,则需要将此窗口顶部的平台更改为x64。如果不存在,请单击“配置管理器”,从“活动解决方案平台”下拉菜单中选择“新建”。添加x64选项。
  • 现在转到添加C:\Program Files (x86)\HDF_Group\HDF5\1.8.13\lib。同样根据需要更改此内容。请注意,如果您为x64构建了二进制文件,则它们将安装在C:\Program Files\HDF_Group\HDF5\1.8.13\
  • 转到。添加libhdf5_D.liblibhdf5_cpp_D.lib(如果将其构建为调试版本),否则(我认为)使用hdf5.libhdf5_cpp.lib

祝你好运!


在HDF5 rev 1.10.4(以及可能的较早版本)中,这甚至更容易。在VS中完成初始构建后,您只需在解决方案资源管理器中构建“INSTALL”目标,安装便会继续进行。然后按照上面回答中描述的项目配置说明进行操作,根据版本适当修改路径。尽管已经是2019年,但我仍使用VS 2013。 - mklein9

3
根据浏览量来看,似乎没有太多人对使用Visual C++进行HDF5操作感兴趣。也许这应该是对我的警告!无论如何,为了后代,我提供以下答案以回答我的原始问题。
首先,必须非常小心在环境设置中正确设置路径变量,并且根据需要设置正确的32位或64位。
不要使用: C:\Program Files (x86)\HDF_Group\HDF5\1.8.13\bin 而是使用: C:\Program Files (x86)\HDF Group\HDF5\1.8.13\bin(注意缺少下划线)
此外,必须注意您想要32位(使用Program File(x86))还是64位(使用Program Files)。如果有人知道在同一台机器上运行使用HDf5的32位和64位程序的更简单方法,请告诉我。
另一个主要问题是示例代码本身。原始形式下它无法工作。经过多次尝试,我发现问题出在使用H5std_string上。当我将它们替换为char []时,一切都能正常工作。例如,不要使用: const H5std_string FILE_NAME("string_test.h5"); 而是使用: char fileName[128] = "string_test.h5"; 然后像这样使用H5File构造函数: H5File file = H5File(fileName, H5F_ACC_TRUNC); 很烦人的是我没有得到编译时错误。构造函数在H5File的构造函数中声称需要std::string(这就是H5std_string所代表的)。很可能,有一些Visual Studio设置可以使原始代码正常工作。但我对Visual C++的知识不够。
无论如何,祝大家好运。
戴夫

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接