2008-12-02 30 views
5

Estoy usando un sistema de archivos makefile con el compilador pvcs (utilizando el compilador de Microsoft Visual C++, 2008) y obtengo varios errores de enlace del formulario:Error de Clrdump (C++) LNK2019: símbolo externo sin resolver __imp__RegisterFilter @ 8 al que se hace referencia en la función _main

error LNK2019: unresolved external symbol [email protected] referenced in function _main

Esto ocurre a pesar de usar el extern "C" declaración, a saber .:

extern "C" int CLRDUMP_API RegisterFilter(LPCWSTR pDumpFileName, unsigned long DumpType); 

Además, en el makeexe.mak, la biblioteca está siendo vinculado como:

$ (COMPILEBASE) \ lib \ clrdump.lib \

Para ser sincero, no soy un experto en makefiles, y estoy cambiando un sistema de Microsoft Visual C++ 6.0 a 2008. Este cambio puede tener algo que ver con los errores de enlace, ya que el sistema solía funcionar antes.

Cualquier ayuda sería realmente apreciada.

Gracias de antemano,

Sinceramente, Joseph

- EDIT 1 -

¿Alguien sabe cómo convertir detallado en el sistema de archivo MAKE de PVC?

Tenga en cuenta que la función anterior es ya una versión del compilador-decorado, teniendo

[email protected] 

mientras que el C++ función es sólo

RegisterFilter 

Gracias por la ayuda, pero si alguien puede poner un mayor solución completa, que también sería muy apreciada.

Atentamente, José

- EDIT 2 -

Algunos persona amable publicado esto, pero cuando firmé en que desapareció:

El imp prefijo indica que esta función ha sido importada desde una DLL. Verifique la definición de CLRDUMP_API - ¿Es __declspec(dllimport)? Vea este artículo para más información.

Hubo un enlace de trabajo, pero he perdido eso, sin embargo, supongo que uno siempre puede buscar el tema.

¡Gracias, quienquiera que fueras!

- Datos 3 -

Gracias ChrisN (todavía no estoy autorizado a votar). A pesar de usar el botón de actualización, tu respuesta desapareció, pero luego volvió a aparecer después de que publiqué una función de cortar y pegar.

Esta es mi definición de que:

define CLRDUMP_API __declspec(dllimport) __stdcall 

supongo que el __stdcall está bien?

- Edición 4 -

Aunque aprecio los esfuerzos de los que respondieron, en particular ChrisN, al menos en mi sistema en particular, sigue siendo el error de enlace. Entonces, si alguien tiene más conocimiento, lo agradecería. Gracias de nuevo.

Respuesta

3

estaba creando un simple C++ aplicación Win32 en VS2005 y que estaba recibiendo este error:

LNK2019: unresolved external symbol __imp__somefunction 

Esta aplicación estaba usando hojas de propiedades, de ahí que requiere esta cabecera (Prsht.h).

La solución a mi problema es el siguiente: en el programa Propiedades → Configuración → Propiedades → Enlazador general, me puse directorios de librerías adicionales a "C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib".

también en el programa de línea de Propiedades Propiedades → Configuración → → Comando Enlazador para los Opciones adicionales, añadí ComCtl32.Lib ComDlg32.Lib.

Mi programa se está ahora compilando sin ningún problema. Mis dos centavos: necesita identificar todas las bibliotecas que requiere su programa. Sugerencia: verifique todos los encabezados que ha incluido, debe asegurarse de que su enlazador pueda verlos.

+1

Estaba desarrollando una aplicación ATL/COM muy simple e intenté llamar al método CreateMappedBitmap (...).Recibí el error LNK2019 para esta llamada de método utilizando VS 2012. La sugerencia anterior sobre cómo agregar comctl32.lib me funciona. no hizo ningún otro cambio. –

3

Intente activar la salida detallada para su vinculador (normalmente un conmutador de línea de comandos). Que le mostrará exactamente cómo el enlazador está tratando de resolver el símbolo, para que pueda ver si:

  • firma del símbolo es lo que espera
  • el enlazador está buscando en el lugar correcto para su biblioteca

¡Espero que esto ayude!

14

El prefijo __imp_ indica que el vinculador espera que esta función se importe de una DLL.

¿La biblioteca clrdump es this page? Si es así, tenga en cuenta que extern "C" no se utiliza en el archivo de encabezado suministrado con la biblioteca. Confirmé esto usando el siguiente comando:

dumpbin /exports clrdump.lib 

que produce la siguiente salida para RegisterFilter - este es un mutilado C++ nombre de la función:

[email protected]@[email protected] (int __stdcall RegisterFilter(unsigned short const *,unsigned long))

He intentado crear un programa de ejemplo mediante el uso de Visual clrdump.lib Studio 2008. Aquí está mi código:

#include <windows.h> 
#include "ClrDump.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    RegisterFilter(L"", 0); 
    return 0; 
} 

construcción de este produjo el siguiente error de vinculador:

LNK2019: unresolved external symbol "__declspec(dllimport) int __stdcall RegisterFilter(wchar_t const *,unsigned long)" ([email protected]@[email protected])

El código se compila correctamente con Visual C++ 6.0.

en cuenta que la salida dumpbin muestra el primer parámetro a RegisterFilter como unsigned short const * pero el error enlazador muestra wchar_t const *. En Visual C++ 6.0, wchar_t es normalmente un typedef para unsigned short, mientras que en versiones posteriores es un tipo integrado distinto.

Para solucionar el problema en Visual Studio 2008, establecí la opción "Tratar wchar_t como tipo incorporado" en "No" (especifique /Zc:wchar_t- en la línea de comandos del compilador) y ahora el código se genera correctamente.

Disculpa la confusión con mi respuesta anterior. ¡Espero que esto sea más útil!

+0

ChrisN: Esto está muy por encima de lo que se espera en estos grupos de publicaciones. Intenté usar un elenco en la función de llamada (el compilador se ocluyó y se eliminó) y también probé la opción del compilador: /Zc: wchar_t- En mi caso, a pesar de hacer una compilación limpia primero, todavía ¡ha fallado! – JosephDoggie

+1

Sin ver más de tu código, no creo que pueda ayudarte más. ¿Tienes el código fuente de la biblioteca? – ChrisN

3

No sé si es su caso, pero el prefijo imp puede significar que está compilando una biblioteca x64 en un proyecto Win32.

1

Uso de un archivo .def

Si decide utilizar __declspec (dllimport) junto con un archivo .def, debe cambiar el archivo .def para utilizar los datos o constante para reducir la probabilidad de que la codificación incorrecta causará un problema:

// project.def 
LIBRARY project 
EXPORTS 
    ulDataInDll CONSTANT 

La siguiente tabla muestra por qué:

Keyword  Emits in the import library Exports 
CONSTANT  _imp_ulDataInDll    _ulDataInDll 
      _ulDataInDll     

DATA   _imp_ulDataInDll    _ulDataInDll 

http://msdn.microsoft.com/en-us/library/aa271769(v=vs.60).aspx

5

Recientemente tuve el mismo problema. Estaba excluyendo una biblioteca para evitar una colisión, y todos los errores desaparecieron, a excepción de los errores LINK (tal como usted describe). Cuando cambié la biblioteca por la otra (estaba excluyendo (ignorando) MSVCRT.lib, ahora estoy excluyendo (ignorando) LIBCMT.lib) el problema desapareció. Asegúrate de no haber mezclado bibliotecas en algún lado. En mi caso, el enlazador estaba fallando con "no se puede encontrar imp _aligned_malloc". Por supuesto que no había ningún método en ninguno de mis códigos con ese nombre. El compilador se anteponía al imp. Exactamente por qué no sé, excepto que el problema desapareció cuando cambié la exclusión (ignorar) como se describe arriba.

Intente comenzar con un nuevo proyecto, y vuelva a agregar los archivos de encabezado & de origen y realice un seguimiento de las bibliotecas que excluye (ignore). Pruebe varias combinaciones. Espero que ayude.

Cuestiones relacionadas