c++ - tipos - Mejores prácticas para la depuración de errores de enlace
depurar aplicacion android en movil (3)
Las bibliotecas C-runtime suelen ser el mayor culpable. 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 útil para indicar qué lib requiere una llamada de API de Win32 particular si aparece como faltante.
Aparte de eso, generalmente se trata de encender la bandera detallada y recorrer la salida en busca de pistas.
Al crear proyectos en C ++, he encontrado que los errores de enlace de depuración son complicados, especialmente cuando selecciono el código de otras personas. ¿Qué estrategias usan las personas para depurar y corregir los errores de enlace?
No estoy seguro de cuál es su nivel de experiencia, pero aquí están los conceptos básicos.
A continuación se muestra un error del enlazador de VS 2005: sí, es un lío gigante si no estás 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 enfocarse:
- "ByteComparator.obj": busque un archivo ByteComparator.cpp, esta es la fuente 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 el código base para esta función y encontrar 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 escenario, es posible que te falte una dependencia "externa", para la que no tienes 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 página de la función timeGetTime () en MSDN le dice que use Winmm.lib en la parte inferior de la página.
Uno de los errores comunes de enlace que he encontrado es cuando una función se usa de forma diferente a cómo se define. 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 tengas en mente?