Red de conocimiento informático - Espacio del host - Después de crear un nuevo proyecto en Visual C 6.0 y compilar el primer archivo, se produjo un error LNK2001 durante la vinculación. ¿Qué está pasando...?

Después de crear un nuevo proyecto en Visual C 6.0 y compilar el primer archivo, se produjo un error LNK2001 durante la vinculación. ¿Qué está pasando...?

Al aprender VC++, a menudo te encuentras con el error de enlace LNK2001. Este error es muy molesto, porque para los programadores, el mejor error a corregir es el error de compilación. En términos generales, cuando ocurre un error de conexión, el compilador. Todo pasó. Hay muchas razones para los errores de conexión, especialmente el error LNK2001, que a menudo confunde a la gente. Sin un estudio profundo y una comprensión de VC++, es muy difícil corregir el error de conexión LNK2001.

En el proceso de aprendizaje de VC++, el mensaje de error LNK2001 que encuentran los principiantes es principalmente:

símbolo externo no resuelto "símbolo" ("símbolo" externo no resuelto).

Este mensaje de error se generará si el vinculador no puede encontrar la función, variable o etiqueta a la que se hace referencia en todas las bibliotecas y archivos de objetos. En términos generales, hay dos razones para los errores: en primer lugar, la función o variable a la que se hace referencia no existe, está escrita incorrectamente o se usa incorrectamente; en segundo lugar, es posible que se esté usando una versión diferente de la biblioteca de conexiones;

Las siguientes son posibles razones del error LNK2001:

1. LNK2001 debido a un error de codificación.

1. Los archivos de código de programa o definición de módulo (.DEF) que no coinciden pueden causar LNK2001. Por ejemplo, si declara una variable "var1" en un archivo fuente de C++ e intenta acceder a la variable como variable "VAR1" en otro archivo, se producirá este error.

2. Si la función en línea utilizada se define en el archivo .CPP en lugar de en el archivo de encabezado, se producirá un error LNK2001.

3. Al llamar a una función, si el tipo de parámetro utilizado no coincide con el tipo cuando se declara la función, se generará LNK2001.

4. Intentar llamar a una función virtual desde un constructor o destructor de clase base dará como resultado LNK2001.

5. Preste atención a la publicidad de funciones y variables. Solo las variables y funciones globales son públicas. Las funciones estáticas y las variables estáticas tienen las mismas restricciones de alcance. Intentar acceder a cualquier variable estática desde fuera de un archivo que no esté declarado dentro de ese archivo dará como resultado un error de compilación o LNK2001.

Las variables (variables locales) declaradas dentro de una función solo se pueden utilizar dentro del alcance de la función.

Las constantes globales de C++ solo tienen capacidades de conexión estática. Esto es diferente de C, donde también se producirán errores LNK2001 si intenta utilizar variables globales en varios archivos en C++. Una solución es agregar el código de inicialización constante al archivo de encabezado cuando sea necesario e incluir el archivo de encabezado en el archivo .CPP. Otro método es asignar una constante a la variable cuando se usa;

6. Cuando se crea una función virtual en una clase base sin una implementación específica de la función virtual en la clase base, se producirá un error LNK2001. La solución es: 1. Definir la función virtual como una función virtual pura. ②. Implemente la función virtual específicamente en la clase base.

2. LNK2001 causado por la configuración de compilación y vinculación

1. Si utiliza la opción /NOD (/NODEFAULTLIB) al compilar, el compilador escribe la biblioteca de tiempo de ejecución y la biblioteca MFC requeridas por el programa en el módulo de archivo objeto al vincular, pero a menos que estos nombres de biblioteca se incluyan explícitamente en el archivo, estos Las bibliotecas no se vincularán al archivo del proyecto. El uso de /NOD en esta situación generará el error LNK2001.

2. Si la entrada del programa no está configurada para wWinMainCRTStartup, 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 en tiempo de ejecución se conservan en la biblioteca de vínculos dinámicos, la referencia a "func" en el archivo de origen es una referencia a "__imp__func" en el archivo de destino. LNK2001 se producirá en __imp__func si se intenta vincular utilizando la biblioteca estática LIBC.LIB o LIBCMT.LIB. LNK2001 también se producirá al vincular con MSVCxx.LIB si se compila sin la opción /MD;

4. Al compilar con la opción /ML, vincular con LIBCMT.LIB provocará que LNK2001 se active _errno.

5. Al compilar una versión de depuración de una aplicación, LNK2001 también ocurrirá si se usa la biblioteca modal de la versión de lanzamiento para conectarse. De manera similar, ocurrirá el mismo problema al usar una versión de depuración de la biblioteca modal para conectarse a una aplicación de la versión de lanzamiento.

6. Mezclar diferentes versiones de bibliotecas y compiladores también puede causar problemas, porque las nuevas versiones de la biblioteca pueden contener símbolos e instrucciones que no están disponibles 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 inserción de funciones (/Ob1 o /Ob2) está activada al crear una biblioteca C++, pero la inserción de funciones está desactivada (sin la palabra clave inline) en el archivo de encabezado correspondiente que describe la función, recibirá este mensaje de error. Para evitar este problema, las funciones en línea deben marcarse con 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 una parte de ellas, y estas son suficientes para comprenderlas por un tiempo. Sin embargo, el propósito de analizar las causas de los errores es evitarlos. Aunque el error LNK2001 es más difícil, aún se puede evitar y solucionar siempre que se preste atención a los problemas anteriores.