c++ - smart - solidity tutorial español pdf




Símbolo externo no resuelto en archivos de objeto (16)

Durante la codificación en Visual Studio obtuve un error de símbolo externo no resuelto y no tengo idea de qué hacer. No se lo que está mal. ¿Podrías por favor descifrarme? ¿Dónde debería estar buscando qué tipo de errores?

1>Form.obj : error LNK2019: unresolved external symbol "public: class Field * __thiscall Field::addField(class Field *)" ([email protected]@@[email protected]@@Z) referenced in function "public: void __thiscall Form::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@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> > &)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z) referenced in function "public: __thiscall InputField::InputField(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" ([email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::prompt(void)" ([email protected]@@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)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@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)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::describe(void)" ([email protected]@@UAEXXZ)
1>C:\Users\tomy\Documents\Visual Studio 2010\Projects\zapoctovkac++\Debug\zapoctovkac++.exe : fatal error LNK1120: 6 unresolved externals

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

#ifdef __cplusplus
extern "C"
{
#endif

y estos al final

#ifdef __cplusplus
}
#endif

Además de la excelente respuesta de Chris Morris anterior, encontré una manera muy interesante de que pueda recibir este mismo error si llama a un método virtual que no se ha configurado como puro, pero que 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 ladrones), pero mi IDE no detectó esta falla 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, cambiando IamInterface myFunc () para que sea un método virtual puro (un método que "debe" implementarse, que un método virtual que es un método en el que se puede "anular") 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 a pasar por el código!


Asegúrese de no intentar 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.



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 usted mismo escribió este código)
  2. no incluya el archivo lib / dll que contiene las definiciones

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

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


Estoy haciendo algo de C ++ por primera vez en mucho tiempo, y estoy obteniendo este error cuando me olvido de agregar el prefijo ClassName :: para la definición de la función, ya que esto es un poco exclusivo de C ++. ¡Así que recuerda comprobar eso también!


Mi problema era un resumen que 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 algo más está construyendo por completo.


Mi problema era: tenía que hacer una declaración directa de la clase cuyo coordinador 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. También al usar espacios de nombres, también los declara .


Otro problema posible (que me acabo de pasar por la cabeza):

Si define sus funciones como en inline , ellas -¡por supuesto! - deben definirse en el encabezado (o en un archivo en línea ), no en una cpp .
En mi caso, estaban en un archivo en línea, pero solo porque eran una implementación específica de la plataforma, y ​​una cpp incluía este archivo inl correspondiente ... en lugar de un encabezado. Sí, sucede.

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


PUNTEROS

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


Simplemente tuve un momento difícil con esto. Todo estaba lógicamente configurado. Declaré un constructor pero no lo definí

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

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


Solo pasé un par de horas para encontrar que el problema era que mi archivo principal tenía extensión .c lugar de .cpp

:/


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

He recompilado la biblioteca como x64 y lo resolvió.


Una posible causa de este error de vinculador también pueden ser las funciones en inline 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.


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

por ejemplo:

#include WtsApi32.h

necesitará:

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

verifique que la plataforma objetivo de su proyecto VS sea coherente con los Binarios que ha descargado.

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





unresolved-external