Símbolo externo sin resolver en archivos de objetos

6 minutos de lectura

Simbolo externo sin resolver en archivos de objetos
novelizador

Durante la codificación en Visual Studio, recibí un error de símbolo externo sin resolver y no tengo idea de qué hacer. No se lo que está mal. ¿Me podrías descifrar por favor? ¿Dónde debo buscar qué tipo de errores?

1>Form.obj : error LNK2019: unresolved external symbol "public: class Field * __thiscall Field::addField(class Field *)" (?addField@Field@@QAEPAV1@PAV1@@Z) referenced in function "public: void __thiscall Form::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Form@@QAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Field::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Field@@UAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: __thiscall InputField::InputField(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (??0InputField@@QAE@AAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::prompt(void)" (?prompt@Field@@UAEXXZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getName(void)" (?getName@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getType(void)" (?getType@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::describe(void)" (?describe@Field@@UAEXXZ)
1>C:\Users\tomy\Documents\Visual Studio 2010\Projects\zapoctovkac++\Debug\zapoctovkac++.exe : fatal error LNK1120: 6 unresolved externals

  • Un símbolo sin resolver es uno que ha declarado en alguna parte pero nunca ha definido. Por lo general, significa que ha incluido el archivo de encabezado de una biblioteca de terceros, pero no le ha dicho al enlazador dónde encontrar los archivos .obj correspondientes para la biblioteca.

    – deong

    29 de marzo de 2012 a las 15:16

  • Un error bastante común es que define una función como independiente y olvida el selector de clase en su .cpp expediente: Haces esto (mal): void myFunc() { /* do stuff */ } En lugar de esto (derecha): void A::myFunc() { /* do stuff */ }

    – jave.web

    11/03/2015 a las 18:43


  • También puede agregar corchetes directamente en su encabezamiento archivo si no desea definirlo más en su archivo .cpp, así: void myFunc() {};.

    – Patapoom

    13 de febrero de 2018 a las 9:34


  • @deong ¿Cómo le dice al enlazador dónde encontrar los archivos .obj correspondientes y dónde estarían normalmente?

    – Matt Arnold

    29 de julio de 2020 a las 16:07

Simbolo externo sin resolver en archivos de objetos
chris morris

Este error a menudo significa que alguna función tiene una declaración, pero no una definición.

Ejemplo:

// A.hpp
class A
{
public:
  void myFunc(); // Function declaration
};

// A.cpp

// Function definition
void A::myFunc()
{
  // do stuff
}

En su caso, la definición no se puede encontrar. El problema podría ser que está incluyendo un archivo de encabezado, que trae algunas declaraciones de funciones, pero usted:

  1. no defina las funciones en su archivo cpp (si escribió este código usted mismo)
  2. no incluya el archivo lib/dll que contiene las definiciones

Un error común es que define una función como independiente y olvida el selector de clase, por ejemplo A::en tus .cpp expediente:

Incorrecto: void myFunc() { /* do stuff */ }

Derecha: void A::myFunc() { /* do stuff */ }

  • ¿Cómo incluir dicho archivo lib en mi proyecto?

    – tmj

    29 de agosto de 2014 a las 13:11

  • @tMJ Depende del entorno que esté utilizando. Buscaría tutoriales en línea o en este sitio.

    – Chris Morris

    30 de agosto de 2014 a las 14:27

  • @ChrisMorris La definición de la función no estaba disponible porque no la vinculé correctamente o algo así. Pero, debido a que el dll no estaba en la memoria y tuvo que cargarse a través de una llamada LoadLibrary. (FTR)

    – tmj

    2 de septiembre de 2014 a las 10:08

  • El último consejo fue exactamente el problema aquí. estaba haciendo void myFunc() {} en lugar de A::void myFunc() {}.

    – Charles

    17/04/2015 a las 13:40

  • Brillante respuesta. De hecho, había olvidado tanto (1) como la parte A:: después de copiar el método desde otro lugar.

    – RoG

    29 de junio de 2017 a las 7:27

1646960648 978 Simbolo externo sin resolver en archivos de objetos
Konrad

Verifique que esté incluyendo todos los archivos de origen dentro de su solución a la que hace referencia.

Si no está incluyendo el archivo fuente (y por lo tanto la implementación) para la clase Field en su proyecto no se construirá y no podrá vincular durante la compilación.

Alternativamente, tal vez esté utilizando una biblioteca estática o dinámica y haya olvidado informarle al enlazador sobre el .lib¿s?

  • Referir los archivos lib correctos resolvió el problema. Use Proyecto->Propiedades->Enlazador->General->Directorios de bibliotecas adicionales y Proyecto->Propiedades->Enlazador->Entrada->Dependencias adicionales para consultar el directorio lib y los archivos lib

    – zak

    23 de febrero de 2018 a las 11:16


  • En mi caso, un simple \ en el archivo *.pro del proyecto Qt faltaba (debería haber sido SOURCES += main.cpp \ para continuar a la línea siguiente).

    – Top Master

    8 de octubre de 2020 a las 8:25


1646960648 611 Simbolo externo sin resolver en archivos de objetos
Fílix

Parece que falta una biblioteca o incluye, puede intentar averiguar qué clase de su biblioteca tiene getName, getType, etc. y poner eso en el archivo de encabezado o usando #include.

Además, si estos son de una biblioteca externa, asegúrese de hacer referencia a ellos en su archivo de proyecto. Por ejemplo, si esta clase pertenece a abc.lib, entonces en su Visual Studio

  1. Haga clic en Propiedades del proyecto.
  2. Vaya a Propiedades de configuración, C/C++, Generar, verifique que apunta a la ubicación abc.lib en Directorios de inclusión adicionales. En Vinculador, Entrada, asegúrese de tener abc.lib en Dependencias adicionales.

Acabo de ver el problema. No puedo llamar a una función desde el archivo principal en el archivo .cpp, declarada correctamente en el archivo .h y definida en el archivo .c. Se encontró un error del enlazador. Mientras tanto, puedo llamar a la función desde el archivo .c habitual. Posiblemente depende de la convención de llamada. La solución fue agregar las siguientes líneas de preprocesamiento en cada archivo .h:

#ifdef __cplusplus
extern "C"
{
#endif

y estos al final

#ifdef __cplusplus
}
#endif

Tuve un error donde mi proyecto fue compilado como x64 proyecto. y he usado un Biblioteca que fue compilado como x86.

Recompilé la biblioteca como x64 y lo resolvió.

1646960649 725 Simbolo externo sin resolver en archivos de objetos
Santo

a veces, si se agrega un nuevo archivo de encabezado, y este error comienza a aparecer debido a eso, también debe agregar la biblioteca para deshacerse de unresolved external symbol.

por ejemplo:

#include WtsApi32.h

necesitará:

#pragma comment(lib, "Wtsapi32.lib") 

1646960650 878 Simbolo externo sin resolver en archivos de objetos
yoJustAndrew

Tuve los mismos errores de enlace, pero de un proyecto de prueba que hacía referencia a otro dll. Descubrí que después de agregar _declspec(dllexport) delante de cada función que se especificó en el mensaje de error, el enlace funcionaba bien.

  • Esta respuesta se refiere a una buena solución, pero parece incompleta (y errónea porque hay dos guiones bajos en __declspec). Si en otro módulo, tendrá que importar los símbolos (con __declspec(dllimport) y no exportarlos. Ver la solución completa en esta respuesta

    – PJ127

    14 de octubre de 2020 a las 6:23

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad