2012-03-01 5 views
6

Para el fondo, me he encontrado con esta portación de un código de base de Linux de tamaño mediano (compilando en un .so gigante) a x64 windows (compilando en .dll). He tenido problemas con los conectores.Errores de símbolos no resueltos dentro de DLL

Como caso de prueba mínima, si se crea un proyecto de Visual Studio desde justo el siguiente archivo:

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

Y puse el tipo de proyecto de DLL y lo construye, me sale un error "LNK2001: sin resolver externo símbolo __imp_UnDecorateSymbolName ". Es decir, el archivo se compila correctamente, pero no se puede vincular a un dll.

Creo que el objetivo es que mi dll se vincule con dbghelp.dll, especialmente porque (al menos en mi sistema) no existe ningún archivo como dbghelp.lib. Entonces, ¿por qué está tratando de resolver ese símbolo ahora, en lugar de cuando mi DLL se carga en una aplicación? ¿Y por qué no puede ver esa función de todos modos?

Para ser claros, he confirmado que estoy compilando la DLL x64, y que dbghelp.dll en C: \ Windows \ System32 es x64.

+0

Todavía necesita para enlazar con la dbghelp.lib biblioteca de importación; esto debe incluirse con Visual Studio, Platform SDK, etc. – Luke

Respuesta

11

Enlaces a bibliotecas compartidas, DLLs de Windows-hablar, requiere lo siguiente:

  1. Un archivo de cabecera en tiempo de compilación: Dbghelp.h.
  2. Una biblioteca de importación en tiempo de enlace: Dbghelp.lib.
  3. Una DLL en tiempo de ejecución: Dbghelp.dll.

Tiene claramente 1 y 3 y falta 2. El SDK de Windows que viene con Visual Studio incluye la biblioteca de importación. Pero debe agregarlo como una dependencia adicional en las opciones del vinculador de su proyecto.

De esta manera:

enter image description here

+1

Eso fue todo. Mi windows-search-fu era débil, mi sistema * does * tiene el dbghelp.lib. Agregarlo a las dependencias funcionaba como un amuleto. – user1243488

+0

Dbghelp es una de las bibliotecas más arcanas de Windows. Ha habido una gran cantidad de versiones diferentes lanzadas y muchas lanzadas fuera de banda con el sistema operativo. Es muy fácil entrar en una situación en la que está llamando a funciones que se encuentran en su máquina de desarrollo, pero que no están presentes en las máquinas normales de destino de vainilla. ¡Sólo sé cuidadoso! –

+4

o podría #pragma comment (lib, "dbghelp.lib") –

Cuestiones relacionadas