Problemas de programación de VC++6.0
Error de enlace de VC++ LNK2001
(Tianjin Fang Chao)
Aprender VC++ a menudo encuentra el error de enlace LNK2001. Este error es molesto porque. para los programadores, el mejor error a corregir es un error de compilación y, en general, cuando ocurre un error de conexión, la compilación ya pasó. Hay muchas razones para los errores de conexión, especialmente el error LNK2001, que a menudo se desconoce. Sin un estudio profundo y una comprensión de VC++, es difícil corregir el error de enlace LNK2001.
En el proceso de aprendizaje de VC ++, los mensajes de error LNK2001 que encuentran los principiantes son principalmente:
Símbolo externo "símbolo" no resuelto ("símbolo" externo no definido).
Este mensaje de error se genera si el vinculador no puede encontrar la función, variable o etiqueta a la que se hace referencia en todos los archivos de biblioteca y archivos de objetos. En términos generales, hay dos razones para este error: primero, la función o variable a la que se hace referencia no existe, está escrita incorrectamente o se usa incorrectamente; segundo, es posible que se esté usando una versión diferente de la biblioteca de enlaces.
Las siguientes son posibles causas de errores de LNK2001:
i. LNK2001 es causado por un error de codificación.
1. LNK2001 puede deberse a que el código del programa o los archivos de definición de módulo (.DEF) no coinciden. Por ejemplo, si declara la variable "var1" en un archivo fuente de C++ y luego intenta declararla como la variable "VAR1" en otro archivo, se producirá un error LNK2001. Por ejemplo, este error ocurre si declara la variable "var1" en un archivo fuente C++ y luego intenta acceder a ella en otro archivo usando la variable "VAR1".
2. Si la función en línea utilizada se define en el archivo .CPP en lugar del archivo de encabezado, se producirá un error LNK2001.
3. Llamar a una función cuyo tipo de parámetro no coincide con el tipo de declaración de función resultará en un error LNK2001.
4. Intentar llamar a una función virtual desde un constructor o destructor de clase base resultará en un error LNK2001.
5. Preste atención a la universalidad de funciones y variables. Sólo las variables y funciones globales son universales. Las funciones estáticas y las variables estáticas tienen las mismas restricciones de alcance de uso. Intentar acceder a cualquier variable estática no declarada en el archivo desde fuera del archivo dará como resultado un error de compilación o LNK2001.
Las variables (variables locales) declaradas en una función sólo se pueden utilizar dentro del alcance de esa función.
Las constantes globales en C++ solo tienen conectividad estática. A diferencia de C, intentar utilizar variables globales en varios archivos en C++ también genera un error LNK2001. Una solución es incluir el código de inicialización de la constante en un archivo de encabezado cuando sea necesario e incluir el archivo de encabezado en un archivo .CPP; otra es asignar la constante a una variable cuando se utiliza;
II. LNK2001 causado por la configuración de compilación y enlace
1. Si usa la opción /NOD (/NODEFAULTLIB) para compilar, la biblioteca de tiempo de ejecución y la biblioteca MFC requeridas por el programa. estar vinculado Cuando el compilador escribe en un módulo de objeto, estas bibliotecas no están vinculadas al archivo del proyecto a menos que estén incluidas explícitamente en el archivo. El uso de /NOD en esta situación generará el error LNK2001.
2. Si no configura la entrada del programa para winMainCRTStartup, recibirá el mensaje de error LNK2001 "externo sin resolver en _WinMain@16" cuando utilice Unicode y MFC.
3. Al compilar con la opción /MD, dado que todas las bibliotecas de tiempo de ejecución se conservan en la biblioteca de vínculos dinámicos, la referencia a "func" en el archivo de origen está en el archivo de destino, es decir, a " Cita __imp__func".
LNK2001 ocurre en __imp__func si intenta vincularse con la biblioteca estática LIBC.LIB o LIBCMT.LIB, y también ocurre cuando se vincula con MSVCxx si compila sin la opción /MD.
4. Al compilar con la opción /ML, se generará LNK2001 si se utiliza LIBCMT.LIB para compilar. LIB genera LNK2001 en _errno.
5. Al compilar la versión de depuración de la aplicación, también se generará LNK2001 al vincularse con la biblioteca del modo de distribución. De manera similar, ocurrirá el mismo problema al usar la biblioteca del modo de depuración para vincularse con la aplicación de distribución; .
6. Mezclar diferentes versiones de bibliotecas y compiladores también puede causar problemas, porque las versiones más nuevas de las bibliotecas pueden contener símbolos e instrucciones que no se encuentran en versiones anteriores.
7. El uso de opciones de compilación en línea y no en línea en diferentes módulos puede causar LNK2001, si la integración en línea está activada al crear una biblioteca C++ (/Ob1 o /Ob2), pero en la descripción de la función Si La inserción en línea está desactivada en el archivo de encabezado correspondiente (sin palabra clave en línea), aparecerá este mensaje de error. Para evitar este problema, debe marcar las funciones en línea usando la palabra clave en línea en el archivo de encabezado correspondiente.
8. Las configuraciones incorrectas de /SUBSYSTEM o /ENTRY también pueden causar LNK2001.
De hecho, hay muchas razones para LNK2001. Las razones anteriores son solo algunas de ellas. Es suficiente que los principiantes comprendan estas razones. Sin embargo, el propósito de analizar la causa de los errores es evitar errores. Aunque los errores de LNK2001 son difíciles, aún se pueden evitar y resolver siempre que se preste atención a los problemas anteriores.