Искажение библиотеки DLL и имен

#c #visual-c #name-decoration

#c #visual-c #оформление имени

Вопрос:

У меня есть сторонняя библиотека, в которой символы экспортируются как обычный C / cdecl, поэтому, например, dumpbin.exe /SYMBOLS сообщается, что экспортируются оба __imp_nvmlInit и nvmlInit .

Однако в Visual Studio 2010, когда я пытаюсь их импортировать, файл заголовка будет иметь

 extern "C" nvmlReturn_t nvmlInit(...);
  

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

main.obj : ошибка LNK2019: неразрешенный внешний символ _nvmlInit, на который ссылается функция _main

Как я могу запретить Visual Studio искать этот символ с начальным подчеркиванием? __declspect(dllimport) не работает, потому что тогда он преобразуется в __imp__nvmlInit (слишком много подчеркиваний).

Спасибо.

Ответ №1:

Это ошибка компоновщика. Вам нужно связать с .Файл библиотеки, связанный с DLL, который даст компоновщику обещание, что функция будет доступна во время выполнения, когда будет загружена сама библиотека DLL.

Комментарии:

1. Упс, извините, я допустил ошибку в своем первоначальном сообщении — на самом деле я ссылаюсь на . LIB, и библиотека экспортирует полностью не оформленные функции, в то время как компоновщик ищет имена с подчеркиванием перед ними…