4
votes

I'm building a plug-in with MS Visual C++ 2010 Express, and I would like to include capabilities from the HDF5 library. I have tried both building HDF5 from source with CMake, and installing the precompiled library (HDF5-1.8.7_CMake_x86_shared.zip for VC 2008). For either build directory/method, I've modified my project property:

  • C/C++ > General > Additional Include Directories: add the include for HDF5
  • Linker > General > Additional Library Directories: add the lib for HDF5

Here is a snippet of my DLL module:

#include "cpp/H5Cpp.h"

static IResult OnBeginDocument (IDocument pDoc)
{
  H5Fcreate("C:\\out.h5", H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT);

  return True;
}

Note that VC++ correctly parses the .h files to, e.g., visually show pop-up documentation for H5Fcreate when I hover my mouse over that snippet. My problem is that I cannot build the module that tries to use H5Fcreate. Here is the console output from my build attempts:

1>MyProject.obj : error LNK2019: unresolved external symbol __imp__H5Fcreate referenced in function "int __cdecl OnBeginDocument(struct IModuleStruct *)" (?OnBeginDocument@@YAHPAUIModuleStruct@@@Z)
1>MyProject.obj : error LNK2019: unresolved external symbol __imp__H5check_version referenced in function "int __cdecl OnBeginDocument(struct IModuleStruct *)" (?OnBeginDocument@@YAHPAUIModuleStruct@@@Z)
1>C:\MyProject\Release\MyProject.dll : fatal error LNK1120: 2 unresolved externals

Both methods of attempting to link in HDF5 (precompiled vs self-compiled, as described above) produce these exact same errors, so I'm not sure where I'm going wrong.


Many thanks to @HasanKhan and @StevieG, these were helpful tips for n00bs like me. Just to follow up clearly, I did indeed need to add lib filepaths in Linker > Input > Additional Dependencies:

hdf5dll.lib
hdf5_cppdll.lib

I may need to add other lib files if I require other HDF5 features. Also, it turned out that I needed to copy the HDF5 DLLs (from bin) into my system directory (e.g., C:\WINDOWS\System32\) for the plugin to operate correctly at runtime. All good now, thanks!

2
In project settings > Linker > Input you need to add the name of the lib file that you want to link with.Muhammad Hasan Khan
Are you missing extern "C" or do you mean to export mangled names?David Heffernan

2 Answers

3
votes
  • Linker > General > Additional Library Directories: you should add the path to the directory containing the .lib file here

  • Linker > General > Input: you should add the name of the .lib file here

1
votes

Check this things:

  1. Linker > Input > Additional Dependencies contains hdf5.lib
  2. Linker > General > Additional Libraries Directories contains path to lib directory of your HDF5 installation
  3. C/C++ > General > Additional Include Directories contains path to include directory of your HDF5 installation
  4. You build configuration match to installed HDF5 version (32 or 64 bit)
  5. You add to PATH variable bin directory of your HDF5 installation

I think it's enough.