2012-03-01 15 views
6

Dla tła, natknąłem się na ten porting średnich linux codebase (kompilacja w gigantyczne .so) do x64 Windows (kompilacja do .dll). Miałem problemy z linkerem.Nierozwiązane błędy symboli wewnątrz DLL

Jako minimalną testcase, jeśli tworzę projekt Visual Studio już od następującego pliku:

#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); 
} 

I ustawić typ projektu do DLL i budować, to pojawia się błąd „LNK2001: Nierozwiązane zewnętrzne symbol __imp_UnDecorateSymbolName ". Oznacza to, że plik jest kompilowany poprawnie, ale nie łączy się z biblioteką DLL.

Myślę, że celem jest dll link do dbghelp.dll, zwłaszcza, że ​​(przynajmniej w moim systemie) nie ma takiego pliku jako dbghelp.lib. Dlaczego więc próbuje on teraz rozwiązać ten symbol, a nie wtedy, gdy moja biblioteka DLL jest ładowana do aplikacji? I dlaczego nie może w ogóle zobaczyć tej funkcji?

Dla jasności potwierdziłem, że buduję bibliotekę DLL x64, a plik dbghelp.dll w C: \ Windows \ System32 to x64.

+0

to musi jeszcze połączyć z dbghelp.lib biblioteki import; to powinno być zawarte w Visual Studio, Platform SDK itp. – Luke

Odpowiedz

11

linkami do współdzielonych bibliotek DLL w Windows-rzec, wymaga:

  1. pliku nagłówka w czasie kompilacji: Dbghelp.h.
  2. Biblioteka importu w czasie połączenia: Dbghelp.lib.
  3. DLL w czasie pracy: Dbghelp.dll.

Masz wyraźnie 1 i 3, których brakuje 2. Zestaw SDK systemu Windows dostarczany z programem Visual Studio zawiera bibliotekę importowania. Ale musisz dodać go jako dodatkową zależność w opcjach linkera twojego projektu.

Jak to:

enter image description here

+1

To wszystko. Moje okno wyszukiwania-fu było słabe, mój system * ma * plik dbghelp.lib. Dodanie go do zależności działało jak czar. – user1243488

+0

Dbghelp to jedna z bardziej tajemniczych bibliotek w systemie Windows. Pojawiła się ogromna liczba różnych wersji, a wiele z nich zostało zwolnionych z systemu operacyjnego. Bardzo łatwo jest dostać się do sytuacji, w której wywołujesz funkcje, które są obecne na twoim komputerze, ale nie są obecne na zwykłych maszynach z docelową wanilią. Tylko bądź ostrożny! –

+4

lub możesz #pragma komentarz (lib, "dbghelp.lib") –

Powiązane problemy