Неразрешенные ошибки символов в 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-говорит, требует следующего:

  1. Заголовочный файл во время компиляции: Dbghelp.h,
  2. Библиотека импорта во время ссылки: Dbghelp.lib,
  3. DLL во время выполнения: Dbghelp.dll,

У вас явно есть 1 и 3, а у вас нет 2. Windows SDK, поставляемый с Visual Studio, включает в себя библиотеку импорта. Но вам нужно добавить его в качестве дополнительной зависимости в настройках компоновщика вашего проекта.

Как это:

Другие вопросы по тегам