Неразрешенные ошибки символов в DLL
Для справки, я сталкивался с портированием базы кода Linux среднего размера (компилирование в гигантский.so) в x64 windows (компилирование в.dll). У меня были проблемы с линкером.
В качестве минимального тестового примера, если я создаю проект Visual Studio только из следующего файла:
#include <Windows.h>
#include <Dbghelp.h>
void do_stuff(char const * s)
{
char buffer[4096];
long int len = UnDecorateSymbolName(
s,
buffer,
sizeof(buffer),
UNDNAME_COMPLETE);
}
И я устанавливаю тип проекта в DLL и собираю его, я получаю сообщение об ошибке "LNK2001: Неразрешенный внешний символ __imp_UnDecorateSymbolName". Таким образом, файл компилируется правильно, но не в состоянии связать в dll.
Я думаю, что цель состоит в том, чтобы моя dll ссылалась на dbghelp.dll, тем более что (по крайней мере, в моей системе) такого файла как dbghelp.lib нет. Так почему же он пытается разрешить этот символ сейчас, а не когда моя DLL загружается в приложение? И почему он не видит эту функцию?
Чтобы было ясно, я подтвердил, что я собираю x64 DLL, и что dbghelp.dll в C:\Windows\System32 - это x64.
1 ответ
Связывание с общими библиотеками, DLL-библиотеками в Windows-говорит, требует следующего:
- Заголовочный файл во время компиляции:
Dbghelp.h
, - Библиотека импорта во время ссылки:
Dbghelp.lib
, - DLL во время выполнения:
Dbghelp.dll
,
У вас явно есть 1 и 3, а у вас нет 2. Windows SDK, поставляемый с Visual Studio, включает в себя библиотеку импорта. Но вам нужно добавить его в качестве дополнительной зависимости в настройках компоновщика вашего проекта.
Как это: