我很难获得使用Visual Studio 2013(C ++)的HDF5示例。 示例位于:http://www.hdfgroup.org/ftp/HDF5/examples/misc-examples/stratt.cpp,我已发布以下代码以获取完整性。
我的第一个问题是:最新的HDF5(版本1.8.13)是否适用于Visual C ++ 2013?文档只提到我可以看到的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
对于Linker->输入,我添加了:hdf5.lib; hdf5_cpp.lib 当我跑步时,我(并非出乎意料)得到了消息,"程序无法启动,因为您的计算机缺少hdf5.dll ..." 所以在调试目录中,我从目录中添加了hdf5.dll和hdf5_cpp.dll: C:\ Program Files(x86)\ HDF_Group \ HDF5 \ 1.8.13 \ bin
然后我得到运行时错误:
应用程序无法正确启动(0xc000007b)。单击“确定”关闭应用程序。有什么想法吗?
顺便说一下,当我尝试x64位版本(使用64位设置,目录和文件)时,我的错误略有不同。程序运行到最后,但没有属性写入控制台,没有文件生成,最后我得到了可怕的错误(在最后一行点击f10之后):
HDF5AttributeExample2.exe中0x000007FEF05E512D(msvcp120d.dll)的未处理异常:0xC0000005:访问冲突读取位置0xFFFFFFFFFFFFFFFF。
在这两种情况下(32位和64位),我的直觉告诉我,我有某种配置问题(错误的lib,错误的设置等)。我非常感谢人们提供的任何帮助或建议。< / p>
如果还有另一个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;
}
答案 0 :(得分:4)
您获得的运行时错误源于您使用的是使用VS2012编译的库。
来自VisualStudio和CMake上的HDF小组website:
首先,确保使用用于创建预构建二进制文件的相同版本的Visual Studio。这是避免运行时错误所必需的。
我建议您自己尝试使用CMake在VS2013上构建源代码。
好的,在尝试为VS2013 Ultimate编译之后,我设法让它支持32位和64位。
cpack -C {Debug | Release} ---config C:\...\"build"\CPackConfig.cmake
。这将为文件创建一个安装程序。C:\Program Files (x86)\HDF_Group\HDF5\1.8.13\include
。相应地更改此路径。如果您使用的是x64版本,则需要将此窗口顶部的平台更改为 x64 。如果它不存在,请单击 Configuration Manager ,然后从 Active Solution平台下拉菜单中选择 New 。添加x64选项。C:\Program Files (x86)\HDF_Group\HDF5\1.8.13\lib
。也相应地改变它。请注意,如果您为x64构建了二进制文件,则它们将安装在 C:\Program Files\HDF_Group\HDF5\1.8.13\
。祝你好运!
答案 1 :(得分: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位(使用程序文件(x86))或64位(使用程序文件)的位置。如果有人知道在使用HDf5的同一台机器上运行32位和64位程序的简单方法,请告诉我。
另一个主要问题是示例代码本身。在它的原始形式,它没有用。经过多次试验和错误,我将问题跟踪到使用H5std_string。当我用char []替换它们时,一切正常。作为一个例子,而不是使用: const H5std_string FILE_NAME(“string_test.h5”); 我用了: char fileName [128] =“string_test.h5”; 并使用H5File构造函数: H5File文件= H5File(fileName,H5F_ACC_TRUNC); 令人讨厌的是我没有得到编译时错误。构造函数声称在H5File的构造函数中使用了std :: string(这是H5std_string的内容)。很可能,某些Visual Studio设置可以使原始代码工作。我对Visual C ++知之甚少。
无论如何都祝你好运。
戴夫