Pregunta

Al crear proyectos en C++, descubrí que depurar errores de vinculación es complicado, especialmente al seleccionar el código de otras personas.¿Qué estrategias utiliza la gente para depurar y corregir errores de vinculación?

¿Fue útil?

Solución

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 del vinculador 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)" (?does_not_exist@@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" (?TextScan@@YAXAAUFileTextStats@@PBD1_N2_J@Z)

Hay un par de puntos en los que centrarse:

  • "ByteComparator.obj": busque un archivo ByteComparator.cpp, este es el origen del problema del vinculador
  • "int __cdecl Does_not_exist(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 buscar en la base del código esta función y encontrar dónde está la implementación.Una vez que sepas dónde está implementada la función, sólo tienes que asegurarte de que los dos lugares estén vinculados.

Si está utilizando VS2005, deberá utilizar el menú contextual "Dependencias del proyecto...".Si está utilizando gcc, buscará en sus archivos MAKE el paso de generación del ejecutable (se llama a gcc con un montón de archivos .o) y agregará el archivo .o que falta.


En un segundo escenario, es posible que le falte una dependencia "externa" para la cual no tiene código.Las bibliotecas Win32 a menudo se implementan en bibliotecas estáticas a las que debe vincularse.En este caso, vaya a MSDN o "MicrosoftGoogle" 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 la lista de propiedades de su proyecto "Propiedades de configuración->Enlazador->Entrada->Dependencias adicionales".Por ejemplo, la función timeGetTime() página en MSDN le indica que use Winmm.lib en la parte inferior de la página.

Otros consejos

Las bibliotecas en tiempo de ejecución de C suelen ser las principales culpables.Asegurándose de que todos sus proyectos tengan la misma configuración: único frente a subprocesos múltiples y estático frente a dll.

La documentación de MSDN es buena para señalar qué biblioteca requiere una llamada a la API de Win32 en particular si falta.

Aparte de eso, generalmente todo se reduce a activar la bandera detallada y revisar la salida en busca de pistas.

Uno de los errores de vinculación más comunes con los que me he encontrado es cuando una función se usa de manera 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 con el que me he encontrado es cuando tengo dos conjuntos de archivos compilados en dos bibliotecas separadas y hago llamadas cruzadas entre bibliotecas.

¿Tiene algún fracaso en mente?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top