Связывание библиотеки HDF5 с проектом DLL Visual C++: неразрешенный внешний символ __imp__*

Я создаю подключаемый модуль для MS Visual C++ 2010 Express и хочу включить возможности из библиотеки HDF5. . Я пробовал как собрать HDF5 из исходного кода с помощью CMake, так и установить предварительно скомпилированную библиотеку (HDF5-1.8.7_CMake_x86_shared.zip для ВК 2008). Для любого каталога/метода сборки я изменил свойство своего проекта:

  • C/C++> Общие> Дополнительные каталоги включения: добавьте include для HDF5
  • Linker> Общие> Дополнительные каталоги библиотек: добавьте lib для HDF5

Вот фрагмент моего модуля DLL:

#include "cpp/H5Cpp.h"

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

  return True;
}

Обратите внимание, что VC++ правильно анализирует файлы .h, чтобы, например, визуально отображать всплывающую документацию для H5Fcreate при наведении указателя мыши на этот фрагмент. Моя проблема в том, что я не могу собрать модуль, который пытается использовать H5Fcreate. Вот вывод консоли из моих попыток сборки:

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

Оба метода попытки связать в HDF5 (предварительно скомпилированный и самокомпилированный, как описано выше) вызывают одни и те же ошибки, поэтому я не уверен, где я ошибаюсь.


Большое спасибо @HasanKhan и @StevieG, это были полезные советы для таких нубов, как я. Просто для ясности мне действительно нужно было добавить пути к файлам lib в Linker > Input > Additional Dependencies:

hdf5dll.lib
hdf5_cppdll.lib

Мне может понадобиться добавить другие файлы lib, если мне потребуются другие функции HDF5. Кроме того, оказалось, что мне нужно скопировать библиотеки DLL HDF5 (из bin) в мой системный каталог (например, C:\WINDOWS\System32\), чтобы плагин работал правильно во время выполнения. Теперь все хорошо, спасибо!


person Mike T    schedule 13.09.2011    source источник
comment
В настройках проекта › Linker › Input вам нужно добавить имя файла lib, с которым вы хотите связать.   -  person Muhammad Hasan Khan    schedule 13.09.2011
comment
Вам не хватает extern "C" или вы хотите экспортировать искаженные имена?   -  person David Heffernan    schedule 13.09.2011


Ответы (2)


  • Linker> Общие> Дополнительные каталоги библиотек: здесь вы должны добавить путь к каталогу, содержащему файл .lib.

  • Linker> General> Input: вы должны добавить сюда имя файла .lib

person StevieG    schedule 13.09.2011

Проверьте это:

  1. Компоновщик > Ввод > Дополнительные зависимости содержит hdf5.lib
  2. Компоновщик > Общие > Каталоги дополнительных библиотек содержит путь к каталогу lib вашей установки HDF5.
  3. C/C++ > General > Additional Include Directory содержит путь к include каталогу вашей установки HDF5.
  4. Вы собираете конфигурацию в соответствии с установленной версией HDF5 (32 или 64 бит).
  5. Вы добавляете в переменную PATH каталог bin вашей установки HDF5.

Я думаю, этого достаточно.

person DenisKolodin    schedule 15.04.2015