C4251 Warning at C++ Example


#1

Hello,

I am using VS 2015 Community Edition and used the installer to get HDF5-1.8.18:

Windows 64-bit [1] Compilers: CMake VS 2015 C, C++, IVF 16

I tried to run this example:

#include <iostream>
#include <string>
#include "H5Cpp.h"
#ifndef H5_NO_NAMESPACE
    using namespace H5;
#endif

const H5std_string FILE_NAME("h5tutr_dset.h5");
const H5std_string DATASET_NAME("dset");
const int NX = 4; // dataset dimensions
const int NY = 6;
const int RANK = 2;

int main (void)
{
    // Try block to detect exceptions raised by any of the calls inside it
    try
    {
    // Turn off the auto-printing when failure occurs so that we can
    // handle the errors appropriately
    Exception::dontPrint();

    // Create a new file using the default property lists.
    H5File file(FILE_NAME, H5F_ACC_TRUNC);

    // Create the data space for the dataset.
    hsize_t dims[2]; // dataset dimensions
    dims[0] = NX;
    dims[1] = NY;
    DataSpace dataspace(RANK, dims);

    // Create the dataset.
    DataSet dataset = file.createDataSet(DATASET_NAME, PredType::STD_I32BE, dataspace);

    } // end of try block
    // catch failure caused by the H5File operations
    catch(FileIException error)
    {
    error.printError();
    return -1;
    }
    // catch failure caused by the DataSet operations
    catch(DataSetIException error)
    {
    error.printError();
    return -1;
    }
    // catch failure caused by the DataSpace operations
    catch(DataSpaceIException error)
    {
    error.printError();
    return -1;
    }
    return 0; // successfully terminated
}

and got four unresolved symbols:

LNK2001 unresolved external symbol "public: static class H5::DSetCreatPropList const & const H5::DSetCreatPropList::DEFAULT" (?DEFAULT@DSetCreatPropList@H5@@2AEBV12@EB)

After adding #define H5_BUILT_AS_DYNAMIC_LIB the errors removed, but two compiler warnings still exist:

C4251 'H5::Exception::detail_message': class 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' needs to have dll-interface to be used by clients of class 'H5::Exception'.

How do I get rid of these warnings?

Best regards

Dennis


#2

Hello,

I’m also getting these warnings when compiling the C++ shared library as well as any program or example that uses hdf5_cpp.dll.
This is using Visual Studio 2015 (Professional) and HDF5-1.8.17. I’ve also tried v1.8.18 and had the same issue with Visual Studio 2013 and 2015.

h5exception.h(93): warning C4251: 'H5::Exception::detail_message': class 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' needs to have dll-interface to be used by clients of class 'H5::Exception'
h5exception.h(94): warning C4251: 'H5::Exception::func_name': class 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' needs to have dll-interface to be used by clients of class 'H5::Exception'

I’d prefer to use the shared libraries in Windows since that’s what we’re using in Linux, but that’s not an option if these warnings can’t be resolved. We’ve enabled the option to treat warnings as errors in our Visual Studio project, so we would have to disable this particular warning if there’s no other way to fix them.

Regards,
Barbara Jones
(no relation to the HDF Group’s Support Lead)

···

From: Hdf-forum [mailto:hdf-forum-bounces@lists.hdfgroup.org] On Behalf Of Dennis Zimmermann
Sent: Sunday, November 20, 2016 10:06 AM
To: hdf-forum@lists.hdfgroup.org
Subject: [Hdf-forum] C4251 Warning at C++ Example

Hello,

I am using VS 2015 Community Edition and used the installer to get HDF5-1.8.18:

Windows 64-bit [1] Compilers: CMake VS 2015 C, C++, IVF 16

I tried to run this example:

#include <iostream>
#include <string>
#include "H5Cpp.h"
#ifndef H5_NO_NAMESPACE
    using namespace H5;
#endif

const H5std_string FILE_NAME("h5tutr_dset.h5");
const H5std_string DATASET_NAME("dset");
const int NX = 4; // dataset dimensions
const int NY = 6;
const int RANK = 2;

int main (void)
{
    // Try block to detect exceptions raised by any of the calls inside it
    try
    {
    // Turn off the auto-printing when failure occurs so that we can
    // handle the errors appropriately
    Exception::dontPrint();

    // Create a new file using the default property lists.
    H5File file(FILE_NAME, H5F_ACC_TRUNC);

    // Create the data space for the dataset.
    hsize_t dims[2]; // dataset dimensions
    dims[0] = NX;
    dims[1] = NY;
    DataSpace dataspace(RANK, dims);

    // Create the dataset.
    DataSet dataset = file.createDataSet(DATASET_NAME, PredType::STD_I32BE, dataspace);

    } // end of try block
    // catch failure caused by the H5File operations
    catch(FileIException error)
    {
    error.printError();
    return -1;
    }
    // catch failure caused by the DataSet operations
    catch(DataSetIException error)
    {
    error.printError();
    return -1;
    }
    // catch failure caused by the DataSpace operations
    catch(DataSpaceIException error)
    {
    error.printError();
    return -1;
    }
    return 0; // successfully terminated
}

and got four unresolved symbols:

LNK2001 unresolved external symbol "public: static class H5::DSetCreatPropList const & const H5::DSetCreatPropList::DEFAULT" (?DEFAULT@DSetCreatPropList@H5@@2AEBV12@EB)

After adding #define H5_BUILT_AS_DYNAMIC_LIB the errors removed, but two compiler warnings still exist:

C4251 'H5::Exception::detail_message': class 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' needs to have dll-interface to be used by clients of class 'H5::Exception'.

How do I get rid of these warnings?

Best regards

Dennis


#3

I’ve met the same problem, using Visual Studio 2019 and HDF5-1.12.0

1>D:\Program Files\HDF_Group\HDF5\1.12.0\include\H5Exception.h(91,36): warning C4251: ‘H5::Exception::detail_message’: class ‘std::basic_string<char,std::char_traits,std::allocator>’ needs to have dll-interface to be used by clients of class ‘H5::Exception’
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\include\xstring(4471): message : see declaration of ‘std::basic_string<char,std::char_traits,std::allocator>’
1>D:\Program Files\HDF_Group\HDF5\1.12.0\include\H5Exception.h(92,31): warning C4251: ‘H5::Exception::func_name’: class ‘std::basic_string<char,std::char_traits,std::allocator>’ needs to have dll-interface to be used by clients of class ‘H5::Exception’
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\include\xstring(4471): message : see declaration of ‘std::basic_string<char,std::char_traits,std::allocator>’