
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

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:
- no defina las funciones en su archivo cpp (si escribió este código usted mismo)
- 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 */ }

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?

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
- Haga clic en Propiedades del proyecto.
- 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ó.

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")

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.
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