使用Visual C ++ 2013在Visual Studio 2013上开始使用HDF5

时间:2014-06-20 10:46:35

标签: visual-c++ visual-studio-2013 hdf5

我很难获得使用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;
}

2 个答案:

答案 0 :(得分:4)

您获得的运行时错误源于您使用的是使用VS2012编译的库。

来自VisualStudio和CMake上的HDF小组website

  

首先,确保使用用于创建预构建二进制文件的相同版本的Visual Studio。这是避免运行时错误所必需的。

我建议您自己尝试使用CMake在VS2013上构建源代码。


好的,在尝试为VS2013 Ultimate编译之后,我设法让它支持32位和64位。

  • 下载源代码并解压缩。我们假设目录名是&#34; source&#34;。
  • 下载CMake并打开GUI,选择源位置并选择&#34; build&#34;位置。
  • 单击“配置”,然后从您正在使用的visual studio中选择版本。
  • 配置选项将在CMake上显示为红色。选择你需要的任何东西。
  • 点击生成。
  • 转到&#34; build&#34;文件夹并打开生成的MSVS解决方案。构建解决方案。
  • 在同一个构建文件夹中运行该命令 &#34; cpack -C {Debug | Release} ---config C:\...\"build"\CPackConfig.cmake。这将为文件创建一个安装程序。
  • 运行此安装程序。
  • 在MSVS中创建一个空项目。转到项目配置属性。然后选择C / C ++ - &gt;一般 - &gt;其他包含目录并插入C:\Program Files (x86)\HDF_Group\HDF5\1.8.13\include。相应地更改此路径。如果您使用的是x64版本,则需要将此窗口顶部的平台更改为 x64 。如果它不存在,请单击 Configuration Manager ,然后从 Active Solution平台下拉菜单中选择 New 。添加x64选项。
  • 现在转到 Linker - &gt;一般 - &gt;其他图书馆目录:添加C:\Program Files (x86)\HDF_Group\HDF5\1.8.13\lib。也相应地改变它。请注意,如果您为x64构建了二进制文件,则它们将安装在 C:\Program Files\HDF_Group\HDF5\1.8.13\
  • Linker - &gt;输入 - &gt;附加依赖。如果您将其构建为调试,则添加 libhdf5_D.lib libhdf5_cpp_D.lib ,否则(我相信)使用 hdf5.lib hdf5_cpp的.lib

祝你好运!

答案 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 ++知之甚少。

无论如何都祝你好运。

戴夫