LIBCD.lib(crt0.obj) aparece cuando se compila vc: error LNK2001: símbolo externo no resuelto _main
Error de la herramienta del vinculador LNK2001
Mensaje de error
Símbolo externo no resuelto 'símbolo'
El código hace referencia a un código que el vinculador no pudo al contenido que se encuentra en bibliotecas y archivos de objetos (como funciones, variables o etiquetas).
Este mensaje de error va seguido del error LNK1120.
Posible causa
Al actualizar una biblioteca administrada o un proyecto de servicio web de Visual C 2003 a Visual C 2005, la opción del compilador /Zl se agrega a la página de propiedades de la línea de comandos en el medio. Esto da como resultado LNK2001. Elimine /Zl de la página de propiedades de la línea de comandos para resolver este problema. Para obtener más información, consulte /Zl (Omitir el nombre de la biblioteca predeterminada) y Cómo: abrir páginas de propiedades del proyecto. Alternativamente, agregue msvcrt.lib y msvcmrt.lib al atributo "Dependencias adicionales" del vinculador.
El código solicita contenido que no existe (por ejemplo, el símbolo está mal escrito o se utiliza mayúsculas y minúsculas incorrectas).
El código solicitaba contenido incorrecto (estaba usando una versión mixta de las bibliotecas, algunas de una versión del producto y otras de otra).
Razones específicas
Problemas de codificación
Si el texto de diagnóstico de LNK2001 informa que __check_commonlanguageruntime_version es un símbolo externo no resuelto, consulte LNK2019 para obtener información sobre cómo resolver el problema. .
La definición de plantilla de miembro excede el alcance de la clase. Una limitación de Visual C es que las plantillas de miembros deben definirse completamente dentro de la clase adjunta. Para obtener más información sobre LNK2001 y las plantillas de miembros, consulte el artículo Q239436 de la base de conocimientos.
Una falta de coincidencia en el código o en los archivos de definición de módulo (.def) causa LNK2001. Por ejemplo, cuando nombra una variable var1 en un archivo fuente C e intenta acceder a la variable como VAR1 en otro archivo fuente.
LNK2001 resultará si un proyecto utiliza funciones incorporadas pero define la función en un archivo .cpp en lugar de un archivo de encabezado.
Llamar una función C desde un programa C sin usar "C" externo (lo que hace que el compilador use la convención de nomenclatura C) da como resultado LNK2001. Las opciones del compilador /Tp y /Tc hacen que el compilador compile archivos en C o C respectivamente, independientemente de la extensión del archivo. Estas opciones pueden hacer que el nombre de la función sea diferente de lo esperado.
Intentar hacer referencia a una función o datos sin un vínculo externo da como resultado LNK2001. En C, las funciones en línea y los datos constantes tienen enlaces internos a menos que se especifiquen explícitamente como externos.
La falta del cuerpo de la función o de las variables provoca LNK2001. Si solo hay prototipos de funciones o declaraciones externas, el compilador continúa sin errores, pero como no se reserva ningún código de función ni espacio variable, el vinculador no podrá resolver llamadas de direcciones o referencias de variables.
Llamar a una función con un tipo de parámetro que no coincide con el tipo de parámetro en la declaración de función da como resultado LNK2001. La decoración del nombre incorpora parámetros de función en el nombre de la función decorada final.
Un prototipo incluido incorrectamente hace que el compilador requiera un cuerpo de función que no se proporciona, lo que da como resultado LNK2001. Si tiene una implementación de la función F tanto de clase como de otra clase, tenga en cuenta las reglas de resolución del alcance de C.
Cuando se utiliza C, incluir un prototipo de función en una definición de clase pero no incluir la implementación (la implementación de esta función por parte de la clase) da como resultado LNK2001.
Intentar llamar a una función virtual pura desde un constructor o destructor de una clase base abstracta da como resultado LNK2001. Las funciones virtuales puras no tienen implementación de clase base.
Intentar utilizar una variable declarada con la función (variable local) fuera del alcance de la función da como resultado LNK2001.
Indica que se requiere código de inicio CRT al crear versiones de lanzamiento de proyectos ATL. Para solucionarlo, realice una de las siguientes acciones:
Elimine _ATL_MIN_CRT de la lista de definiciones de preprocesador para permitir la inclusión del código de inicio de CRT. Para obtener más información, consulte la página de propiedades Opciones de configuración general.
Si es posible, elimine las llamadas a funciones CRT que requieren código de inicio CRT y en su lugar utilice sus equivalentes Win32. Por ejemplo, utilice lstrcmp en lugar de strcmp. Las funciones conocidas que requieren código de inicio CRT son algunas funciones de cadena y de punto flotante.
Problemas de compilación y vinculación
Al proyecto le falta una referencia a un archivo de biblioteca (.LIB) u objeto (.OBJ). Para obtener más información, consulte Archivos .lib utilizados como entrada del vinculador.
Si usa /NODEFAULTLIB o /Zl, las bibliotecas que contienen el código requerido no se vincularán al proyecto a menos que se incluyan explícitamente. (Al compilar con /clr o /clr:pure, verá una referencia a .cctor; consulte Inicialización de ensamblajes mixtos para obtener más información).
Si está utilizando Unicode y MFC, sin crear una entrada punto para wWinMainCRTStartup, obtendrá un objeto externo sin resolver en _WinMain@16; use /ENTRY. Consulte Resumen de programación Unicode.
Para obtener más información, consulte los siguientes artículos de la base de conocimientos ubicados en la biblioteca de MSDN. En la biblioteca de MSDN, haga clic en la pestaña Buscar, pegue el número del artículo o el título del artículo en el cuadro de texto y luego haga clic en Listar temas. Si busca por número de artículo, asegúrese de que la opción "Buscar solo título" esté desactivada.
Q125750 "PRB: Error LNK2001: '_WinMain@16': Símbolo externo no resuelto"
Q131204 "PRB: La selección incorrecta del proyecto causa LNK2001 en _WinMain@16"
Q100639 “Compatibilidad Unicode en la biblioteca Microsoft Foundation Class”
Q291952 “PRB: Error de vínculo LNK2001: Símbolo externo no resuelto _main”
Comparar código compilado con /MT con la biblioteca LIBC Los enlaces .lib provocan LNK2001 en _beginthread, _beginthreadex, _endthread y _endthreadex.
Vincular código que requiere bibliotecas multiproceso (cualquier código MFC o código compilado con /MT) causará LNK2001 en _beginthread, _beginthreadex, _endthread y _endthreadex.
Para obtener más información, consulte el siguiente artículo de la base de conocimientos:
Q126646 "PRB: Mensaje de error: LNK2001 en __beginthreadex y __endthreadex"
Q128641 "INFO: Opciones del compilador /Mx y LIBC, LIBCMT, MSVCRT Libs"
Q166504 "PRB: MFC y CRT deben coincidir en depuración/lanzamiento y estático/dinámico"
Al compilar con /MD, porque todas las ejecuciones ahora se almacenan en una DLL, por lo que la referencia "func" en el código fuente se convierte en una referencia "__imp__func" en el objeto. Si intenta vincularse con las bibliotecas estáticas LIBC.lib o LIBCMT.lib, obtendrá LNK2001 en __imp__func. Al compilar sin /MD, no siempre obtiene LNK2001 si intenta vincular con MSVCxx.lib, pero puede haber otros problemas.
La vinculación con una biblioteca en modo de lanzamiento provoca LNK2001 al crear una versión de depuración de una aplicación. Del mismo modo, usar la opción /Mxd (/MTd o /MDd) y/o definir _DEBUG antes de vincular con el repositorio puede resultar en objetos externos no resueltos (entre otros problemas). Vincular una compilación en modo de lanzamiento con una biblioteca de depuración puede causar problemas similares.
Mezclar versiones de la biblioteca de Microsoft y versiones del producto compilador puede resultar problemático. Las nuevas versiones del compilador de la biblioteca pueden contener nuevos símbolos que no se encuentran en versiones anteriores de la biblioteca. Es posible que deba cambiar el orden de los directorios en la ruta de búsqueda o cambiarlos para que apunten a la versión actual.
El orden de búsqueda se puede cambiar usando el cuadro de diálogo Herramientas | Opciones | Proyectos | Catálogo VC en la selección de archivos de biblioteca. La carpeta Vinculadores en el cuadro de diálogo Páginas de propiedades del proyecto también puede contener rutas que pueden estar desactualizadas.
Este problema puede ocurrir cuando se instala un nuevo SDK (quizás en una ubicación diferente), pero el orden de búsqueda no se actualiza para apuntar a la nueva ubicación. Normalmente, las rutas a los directorios include y lib del nuevo SDK deben colocarse antes de la ubicación predeterminada de Visual C. Además, los proyectos que contienen rutas integradas aún pueden apuntar a rutas antiguas que son válidas pero desactualizadas para nuevas características agregadas por nuevas versiones instaladas en diferentes ubicaciones.
Actualmente no existe ningún estándar de nomenclatura C entre proveedores de compiladores, ni siquiera entre diferentes versiones del mismo compilador. Por lo tanto, vincular archivos objeto compilados con otros compiladores puede no producir el mismo esquema de nombres, lo que genera el error LNK2001.
La combinación de opciones de compilación en línea y no en línea en diferentes módulos da como resultado LNK2001. Este error ocurrirá si la biblioteca C se creó con la función incorporada activada (/Ob1 o /Ob2), pero el archivo de encabezado correspondiente que describe la función tiene la función incorporada desactivada (sin la palabra clave incorporada). Para evitar este problema, defina funciones en línea con inline en un archivo de encabezado que desee incluir en otros archivos.
Si usa la directiva del compilador #pragma inline_ Depth, asegúrese de haberla establecido en un valor de 2 o mayor, y asegúrese de usar la opción del compilador /Ob1 u /Ob2.
Omitir la opción LINK /NOENTRY al crear una DLL de solo recursos dará como resultado LNK2001.
El uso de configuraciones incorrectas de /SUBSYSTEM o /ENTRY puede causar LNK2001.
Por ejemplo, si escribe una aplicación basada en caracteres (aplicación de consola) y especifica /SUBSYSTEM:WINDOWS, obtendrá un objeto externo WinMain sin resolver. Para obtener más información sobre estas opciones y puntos de entrada, consulte Opciones del vinculador /SUBSYSTEM y /ENTRY.
Problemas de exportación
LNK2001 ocurre al portar una aplicación de 16 bits a 32 bits o 64 bits. La sintaxis actual del archivo de definición de módulo (.def) requiere que las funciones __cdecl, __stdcall y __fastcall aparezcan en la sección EXPORTACIONES sin un guión bajo (sin modificación). Esto difiere de la sintaxis de 16 bits, donde estas funciones deben subrayarse (modificarse) cuando se enumeran. Para obtener más información, consulte la descripción de la sección EXPORTACIONES del archivo de definición del módulo.
Cualquier exportación listada en el archivo .def pero no encontrada dará como resultado LNK2001. Esto podría deberse a que la exportación no existe, está mal escrita o utiliza nombres calificados con C (los archivos .def no aceptan nombres decorados).
Resultado de la interpretación
Si no se puede resolver el símbolo, utilice la siguiente guía para obtener información sobre la función:
En plataformas x86, utilice el nombre compilado en C o C La modificación de la convención de llamada para nombres "C" externos es:
__cdecl
Las funciones tienen un prefijo de guión bajo (_).
__stdcall
Las funciones tienen un prefijo de guión bajo (_) y un sufijo @, seguidos por el tamaño alineado de doble palabra del argumento en la pila.
__fastcall
Las funciones tienen un prefijo @ y un sufijo @, seguidos por el tamaño alineado de doble palabra del argumento en la pila.
Utilice undname.exe para obtener la forma sin modificar del nombre modificado.
Para obtener más información sobre algunos de los motivos enumerados anteriormente, consulte Decoración del nombre.