Símbolo externo no resuelto en archivos objeto


Durante la codificación en Visual Studio tengo un error de símbolo externo sin resolver y no tengo idea de qué hacer. No se que pasa. ¿Podrías por favor descifrarme? ¿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
Author: moffeltje, 2012-03-29

23 answers

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 función, pero o bien:

  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

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

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

 271
Author: Chris Morris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-12 23:44:36

Compruebe que está incluyendo todos los archivos de origen dentro de su solución a los 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 usted está utilizando una biblioteca estática o dinámica y se ha olvidado de decirle al enlazador acerca de la .lib s?

 22
Author: Konrad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-29 15:40:21

Parece que le falta una biblioteca o include, puede intentar averiguar qué clase de su biblioteca tiene getName, GetType, etc... y ponlo en el archivo de encabezado o usando #include.

También 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 un abc.lib entonces en su Visual Studio

  1. Haga clic en Propiedades del proyecto.
  2. Vaya a Propiedades de configuración, C / C++, Generar, verificar apuntas al abc.lib ubicación bajo Adicional Incluir Directorios. En Enlazador, Entrada, asegúrese de que tiene la abc.lib bajo Dependencias Adicionales.
 11
Author: Fylix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-12 23:08:34

Acabo de ver el problema de que no puedo llamar a una función desde main in .archivo cpp, correctamente declarado en .h archivo y definido en .archivo c. Se ha encontrado un error de enlazador. Mientras tanto puedo llamar a la función de lo habitual .archivo c. Posiblemente depende de la convención de llamadas. La solución era agregar las siguientes líneas preproc en cada .archivo h:

#ifdef __cplusplus
extern "C"
{
#endif

Y estos al final

#ifdef __cplusplus
}
#endif
 6
Author: Alexey257,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-14 13:40:28

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

He recompilado la biblioteca como x64 y lo solucionó.

 4
Author: Gal Bracha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-06 13:55:20

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

 3
Author: meJustAndrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-08 12:41:45

Además de la excelente respuesta de Chris Morris anterior, encontré una forma muy interesante de recibir este mismo error si está llamando a un método virtual que no se ha establecido en pure pero no tiene su propia implementación. Es exactamente la misma razón (el compilador no puede encontrar una implementación del método y por lo tanto crooks), pero mi IDE no detectó este error en lo más mínimo.

Por ejemplo, el siguiente código obtendría un error de compilación con el mismo mensaje de error:

//code testing an interface
class test
{
   void myFunc(); 
}

//define an interface
class IamInterface
{
    virtual void myFunc();
}

//implementation of the interface
class IamConcreteImpl
{
    void myFunc()
    {
       1+1=2;
    }
}

Sin embargo, cambiar IamInterface myFunc() para que sea un método virtual puro (un método que "debe" ser implementado, que de un método virtual que es un método que "puede" ser anulado) eliminará el error de compilación.

//define an interface
class IamInterface
{
    virtual void myFunc() = 0;
}

¡Espera que esto ayude a la próxima persona de StackOverFlow a pasar por el código!

 2
Author: GMLewisII,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-11 13:26:04

Asegúrese de decorar sus archivos de encabezado con

#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H

// your header code here

#endif

Las cosas malas, incluyendo esto, pueden suceder si no lo haces

 2
Author: Panouden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-24 23:00:45

Creo que la mayoría de los puntos con respecto a las causas y remedios han sido cubiertos por todos los contribuyentes en este hilo. Solo quiero señalar que mi problema 'externo no resuelto' fue causado por un tipo de datos definido como macro que se sustituye de manera diferente a lo esperado, lo que resulta en que ese tipo incorrecto se suministre a la función en cuestión, y como la función con tipo nunca se define, no podría haberse resuelto. En particular, bajo el lenguaje C / C++ ->, hay un atributo llamado 'Treat WChar_t As Built in Type, que debería haber sido definido como' No (/Zc: wchar_t-)' pero no lo hizo en mi caso.

 2
Author: Patrick Nguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-17 23:24:09

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

Por ejemplo:

#include WtsApi32.h

Necesitará:

#pragma comment(lib, "Wtsapi32.lib") 
 2
Author: Shashank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-21 14:26:31

Acabo de tener un momento difícil con esto. Todo estaba organizado lógicamente. Declaré un constructor pero no lo definí

class SomeClass
{
   SomeClass();  // needs the SomeClass::SomeClass(){} function defined somewhere, even here
}

Casi me golpeé la cabeza con el teclado cuando olvidé algo tan elemental.

 1
Author: Joe Plante,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-18 06:25:59

Estoy haciendo algo de C++ por primera vez en mucho tiempo, y estoy recibiendo este error cuando me olvido de agregar el prefijo className:: para la definición de la función, ya que esto es un poco único para C++. Así que recuerde comprobar para que también!

 1
Author: Matthew Hayes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-23 21:13:54

Ver Error de Herramientas de enlace LNK2019 en MSDN, tiene una lista detallada de problemas comunes que causan LNK2019.

 1
Author: Alessandro Jacopson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-12 12:46:42

Una posible causa de este error de enlazador también puede ser inline funciones que se declaran pero no se definen en un archivo de encabezado que luego se incluye en otro lugar. Las funciones en línea deben definirse en cada unidad de traducción en la que se utilizan.

 1
Author: bweber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-26 13:22:37

PUNTEROS

Tuve este problema y lo resolví usando puntero. Veo que este no era su problema, pero pensé en mencionarlo porque me hubiera gustado que hubiera estado aquí cuando vi esto hace una hora. Mi problema era declarar una variable miembro estática sin definirla (la definición tenía que venir después de otras configuraciones) y, por supuesto, un puntero no necesita una definición. Error igualmente elemental: P

 0
Author: Rabel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-07 09:09:48

Mi problema fue que un sconscript no tenía el archivo cpp definido en él. Esto puede ser muy confuso porque Visual Studio tiene el archivo cpp en el proyecto, pero se está construyendo algo completamente diferente.

 0
Author: ubershmekel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-21 00:03:33

Mi problema era: Tenía que hacer declaración de reenvío de la clase cuyo ctor era "externo no resuelto".

En el archivo donde obtuve el error, tuve que poner algo como esto:

#include "ClassB" 

class ClassB; // this solved the problem

class ClassA{
    void foo(){
        ClassB* tmp = new ClassB();
        // ...
    }
};

Por supuesto, mi proyecto es mucho más complicado y esto es solo un ejemplo de fragmento. También cuando se usan espacios de nombres, declararlos también.

 0
Author: vicrucann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:29

Acabo de pasar un par de horas para encontrar que el problema era que mi archivo principal tenía extensión .c en lugar de .cpp

:/

 0
Author: Madhur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-15 23:49:13

Compruebe que su plataforma de destino VS project es consistente con los binarios que ha descargado.

Por ejemplo: Plataforma: Win32 ---- VS2013 32bits 6.3(estática)

 0
Author: isunchy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-28 08:30:50

Otra posibilidad para comprobar, fue mi problema esta vez.

Había agregado la función a la biblioteca e incluido la carpeta de salida de la biblioteca en la ruta de búsqueda.

Pero también tenía una carpeta con una versión anterior de la biblioteca listada anteriormente, por lo que VS estaba usando la biblioteca antigua, y por supuesto no encontraba la nueva función.

 0
Author: Francesco Dondi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-13 08:27:07

Asegúrese de que no está tratando de sobrecargar los operadores de inserción o extracción como funciones en línea. Tuve este problema y solo desapareció cuando eliminé esa palabra clave.

 0
Author: Beck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-17 04:00:37

Lo que lo había causado en mi caso:

Tenía un archivo enorme Foo.cpp sin un Foo.h. Foo.cpp comenzó así:

// ... 100 LOC here ...
namespace NS {
// ... 100 more LOC here ...
static int var;

Eliminé la palabra clave "estática" y agregué un Foo.h con esto:

extern int var;

¿Ves el error?

Me perdí totalmente que var se definió originalmente en un espacio de nombres, porque la declaración de espacio de nombres estaba enterrada en otro código. La solución es cambiar el extern así:

namespace NS {
     extern int var;
}
 0
Author: Stefan Monov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-02 14:54:19

Otro posible problema (que acabo de rascarme la cabeza durante algún tiempo):

Si defines tus funciones como inline, ¡por supuesto!- debe definirse en el encabezado (o en un archivo inline), no en un cpp.
En mi caso, estaban en un archivo inline, pero solo porque eran una implementación específica de la plataforma, y un cpp incluía este archivo inl correspondiente instead en lugar de un encabezado. Sí, eso pasa.

Pensé que deje esto aquí, también, tal vez alguien más se encuentra con el mismo problema y lo encuentra aquí.

 -1
Author: Johann Studanski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-16 22:30:44