2008-08-29 11 views

Respuesta

22

No estoy seguro de cuál es su nivel de experiencia, pero estos son los conceptos básicos.

A continuación se muestra un error de engarce de VS 2005 - sí, es un desastre gigante si no está familiarizado con él.

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" ([email protected]@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" ([email protected]@[email protected]@[email protected]) 

Hay un par de puntos para centrarse en:

  • "ByteComparator.obj" - Busque un archivo ByteComparator.cpp, este es el origen del problema enlazador
  • "int does_not_exist __cdecl (void)" - este es el símbolo que no pudo encontrar, en este caso una función llamada does_not_exist()

en este punto, en muchos casos la forma más rápida de resolución es la búsqueda t El código base para esta función y encuentra dónde está la implementación. Una vez que sepa dónde se implementa la función, solo tiene que asegurarse de que los dos lugares se vinculen entre sí.

Si usa VS2005, debe usar el menú contextual "Dependencias del proyecto ...". Si está utilizando gcc, buscará en sus archivos make el paso de generación ejecutable (se llama gcc con un grupo de archivos .o) y agregará el archivo .o faltante.


En un segundo caso, es posible que te falte una dependencia "externa", para la que no tienes el código. Las bibliotecas de Win32 muchas veces se implementan en bibliotecas estáticas a las que tiene que vincular. En este caso, vaya a MSDN o "Microsoft Google" y busque la API. En la parte inferior de la descripción de la API, se proporciona el nombre de la biblioteca. Agregue esto a las propiedades de su proyecto "Propiedades de configuración-> Enlazador-> Entrada-> Dependencias Adicionales" lista. Por ejemplo, la función timeGetTime() 'page on MSDN le dice que use Winmm.lib en la parte inferior de la página.

+0

Bueno, y si encuentro el lugar donde se implementa el método y no veo nada de malo en él, ¿qué debo hacer a continuación? ¿Hay alguna forma de obtener una lista de archivos vinculados?Su respuesta es segura para los principiantes, pero este es el resultado de los primeros 1 para la depuración del enlazador y hay otras causas posibles que el error ortográfico en el nombre de la función. –

2

Uno de los errores comunes de enlace que he encontrado es cuando una función se usa de forma diferente a como está definida. Si ve un error de este tipo, debe asegurarse de que cada función que utilice esté declarada correctamente en algún archivo .h.
También debe asegurarse de que todos los archivos fuente relevantes estén compilados en el mismo archivo lib. Un error que me he encontrado es cuando tengo dos juegos de archivos compilados en dos bibliotecas separadas, y hago una llamada cruzada entre bibliotecas.

¿Hay alguna falla que tenga en mente?

+0

Esta llamada cruzada, ¿qué tipo de error le da? – Doug

3

Las bibliotecas C-runtime a menudo son las principales culpables. Asegurándose de que todos sus proyectos tengan la misma configuración: wrt, single vs multi-threading y static vs dll.

La documentación de MSDN es buena para indicar qué lib necesita una API de Win32 en particular si falta.

Aparte de eso, generalmente se trata de encender la bandera detallada y vadear la salida en busca de pistas.

Cuestiones relacionadas