Неразрешенные ошибки символов в DLL - PullRequest
6 голосов
/ 01 марта 2012

Для справки, я сталкивался с портированием базы кода Linux среднего размера (компилируется в гигантский .so) в x64 окна (компилируется в .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 Ответ

13 голосов
/ 02 марта 2012

Для связи с общими библиотеками, библиотеками DLL на языке Windows, требуется следующее:

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

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

Как это:

enter image description here

...