Я пытаюсь прочитать файл HDF5, это первый раз, когда я сталкиваюсь с этим форматом файла, поэтому, пожалуйста, разберитесь со мной. Проблема, с которой я столкнулся прямо сейчас, - это привязка библиотеки hdf5 к моему проекту в Visual Studio 2017. Вот что я сделал до сих пор:

  1. Компоновщик> Ввод> Дополнительные зависимости содержит hdf5.lib
  2. Компоновщик> Общие> Каталоги дополнительных библиотек содержит путь к каталогу lib моей установки HDF5
  3. C / C ++> Общие> Дополнительные каталоги включения содержит путь для включения каталога моей установки HDF5
  4. Я добавил в каталог bin переменной PATH моей установки HDF5

Следуя шагам решения, предложенного здесь.

Однако при создании проекта у меня все еще возникают следующие ошибки компоновщика.

1>EigenExperiment.obj : error LNK2019: unresolved external symbol "public: __cdecl H5::DataSpace::DataSpace(int,unsigned __int64 const *,unsigned __int64 const *)" (??0DataSpace@H5@@QEAA@HPEB_K0@Z) referenced in function main
1>EigenExperiment.obj : error LNK2019: unresolved external symbol "public: int __cdecl H5::DataSpace::getSimpleExtentDims(unsigned __int64 *,unsigned __int64 *)const " (?getSimpleExtentDims@DataSpace@H5@@QEBAHPEA_K0@Z) referenced in function main
1>EigenExperiment.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl H5::DataSpace::~DataSpace(void)" (??1DataSpace@H5@@UEAA@XZ) referenced in function main
1>EigenExperiment.obj : error LNK2019: unresolved external symbol "public: class H5::DataSet __cdecl H5::H5Location::openDataSet(char const *,class H5::DSetAccPropList const &)const " (?openDataSet@H5Location@H5@@QEBA?AVDataSet@2@PEBDAEBVDSetAccPropList@2@@Z) referenced in function main
1>EigenExperiment.obj : error LNK2019: unresolved external symbol "public: enum H5T_class_t __cdecl H5::AbstractDs::getTypeClass(void)const " (?getTypeClass@AbstractDs@H5@@QEBA?AW4H5T_class_t@@XZ) referenced in function main
1>EigenExperiment.obj : error LNK2019: unresolved external symbol "public: virtual class H5::DataSpace __cdecl H5::DataSet::getSpace(void)const " (?getSpace@DataSet@H5@@UEBA?AVDataSpace@2@XZ) referenced in function main
1>EigenExperiment.obj : error LNK2019: unresolved external symbol "public: void __cdecl H5::DataSet::read(void *,class H5::DataType const &,class H5::DataSpace const &,class H5::DataSpace const &,class H5::DSetMemXferPropList const &)const " (?read@DataSet@H5@@QEBAXPEAXAEBVDataType@2@AEBVDataSpace@2@2AEBVDSetMemXferPropList@2@@Z) referenced in function main
1>EigenExperiment.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl H5::DataSet::~DataSet(void)" (??1DataSet@H5@@UEAA@XZ) referenced in function main
1>EigenExperiment.obj : error LNK2019: unresolved external symbol "public: __cdecl H5::H5File::H5File(char const *,unsigned int,class H5::FileCreatPropList const &,class H5::FileAccPropList const &)" (??0H5File@H5@@QEAA@PEBDIAEBVFileCreatPropList@1@AEBVFileAccPropList@1@@Z) referenced in function main
1>EigenExperiment.obj : error LNK2019: unresolved external symbol "public: virtual void __cdecl H5::H5File::close(void)" (?close@H5File@H5@@UEAAXXZ) referenced in function main
1>EigenExperiment.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl H5::H5File::~H5File(void)" (??1H5File@H5@@UEAA@XZ) referenced in function main
1>EigenExperiment.obj : error LNK2001: unresolved external symbol "public: static class H5::DataSpace const & const H5::DataSpace::ALL" (?ALL@DataSpace@H5@@2AEBV12@EB)
1>EigenExperiment.obj : error LNK2001: unresolved external symbol "public: static class H5::FileAccPropList const & const H5::FileAccPropList::DEFAULT" (?DEFAULT@FileAccPropList@H5@@2AEBV12@EB)
1>EigenExperiment.obj : error LNK2001: unresolved external symbol "public: static class H5::FileCreatPropList const & const H5::FileCreatPropList::DEFAULT" (?DEFAULT@FileCreatPropList@H5@@2AEBV12@EB)
1>EigenExperiment.obj : error LNK2001: unresolved external symbol "public: static class H5::DSetMemXferPropList const & const H5::DSetMemXferPropList::DEFAULT" (?DEFAULT@DSetMemXferPropList@H5@@2AEBV12@EB)
1>EigenExperiment.obj : error LNK2001: unresolved external symbol "public: static class H5::DSetAccPropList const & const H5::DSetAccPropList::DEFAULT" (?DEFAULT@DSetAccPropList@H5@@2AEBV12@EB)
1>EigenExperiment.obj : error LNK2001: unresolved external symbol "public: static class H5::PredType const & const H5::PredType::NATIVE_FLOAT" (?NATIVE_FLOAT@PredType@H5@@2AEBV12@EB)
1>C:\Users\maxim\source\repos\EigenExperiment\x64\Debug\EigenExperiment.exe : fatal error LNK1120: 17 unresolved externals
1>Done building project "EigenExperiment.vcxproj" -- FAILED.

Кроме того, я прикрепил код, который использую, на случай, если что-то пропустил. Любая гепатит очень ценится :)

#include <iostream>
#include <Eigen/Dense>
#include <filesystem>
#include <math.h>
#include "H5Cpp.h"
#include <vector>
#include <string>


using namespace std;
using namespace H5;


int main()
{
    string ifn = "basler.h5";
    string datasetPath = "/face_g_tobii/data";

    // Open HDF5 file handle, read only
    H5File fp(ifn.c_str(), H5F_ACC_RDONLY);

    // access the required dataset by path name
    DataSet dset = fp.openDataSet(datasetPath.c_str());

    // get the dataspace
    DataSpace dspace = dset.getSpace();

    // get the dataset type class
    H5T_class_t type_class = dset.getTypeClass();
    // According to HDFView, this is a 32-bit floating-point

    // get the size of the dataset
    hsize_t rank;
    hsize_t dims[2];
    rank = dspace.getSimpleExtentDims(dims, NULL); // rank = 1
    cout << "Datasize: " << dims[0] << endl; // this is the correct number of values

    // Define the memory dataspace
    hsize_t dimsm[1];
    dimsm[0] = dims[0];
    DataSpace memspace(1, dimsm);


    // create a vector the same size as the dataset
    vector<float> data;
    data.resize(dims[0]);
    cout << "Vectsize: " << data.size() << endl;


    float data_out[65341];
    for (int i = 0; i < 65341; i++)
    {
        data_out[i] = 0;
    }
    // pass pointer to the array (or vector) to read function, along with the data type and space.
    dset.read(data_out, PredType::NATIVE_FLOAT, memspace, dspace); // FAILS
    dset.read(data_out, PredType::NATIVE_FLOAT, dspace);           // FAILS
    dset.read(data.data(), PredType::NATIVE_FLOAT, memspace, dspace); // FAILS


    // close the HDF5 file
    fp.close();
}
0
A95 4 Июл 2021 в 15:36

3 ответа

Лучший ответ

Оказалось, что сначала должны быть названы внешние библиотеки, у меня сработало следующее:

1.4 Выберите Linker-> Input и, начиная со строки «Additional Dependencies», введите имена библиотек. Сначала должны быть указаны внешние библиотеки, затем библиотека HDF5, а затем, необязательно, библиотеки высокого уровня HDF5, Fortran или C ++. Например, чтобы скомпилировать приложение C ++, введите:

      szip.lib zlib.lib hdf5.lib hdf5_cpp.lib

Это из документации HDF5, которую я полностью упустил: /

0
A95 5 Июл 2021 в 19:06

В соответствии с ошибкой созданный вами проект является версией x64, я предлагаю вам проверить, является ли связанный hdf5.lib 32-битным или 64-битным? Вам следует использовать 64-битный hdf5.

И я предлагаю вам попробовать проверить, соответствует ли платформа и выбранная конфигурация на странице свойств x64 и debug.

enter image description here

Я предлагаю вам выбрать «Все платформы» для платформы и выбрать «Все конфигурации» для конфигурации при изменении свойств.

enter image description here

0
Jeaninez - MSFT 5 Июл 2021 в 06:05

Я пытаюсь использовать hdf5 для c ++ на vs2019, и я сделал то, что добавил szip.lib zlib.lib hdf5.lib hdf5_cpp.lib, но тогда я не могу найти обе библиотеки szip и zlib. Конечно, я сделал "H5_BUILT_AS_DYNAMIC_LIB" на препроцессоре, но ничего.

0
Martin Millicovsky 10 Июл 2021 в 23:05