c++ error - Simbolo esterno non risolto nei file oggetto




lnk2019 unresolved (20)

Ho passato solo un paio d'ore a scoprire che il problema era che il mio file principale aveva estensione .c invece di .cpp

:/

Durante la codifica in Visual Studio ho ricevuto un errore di simbolo esterno non risolto e non ho idea di cosa fare. Non so cosa c'è che non va. Potresti per favore decifrarmi? Dove dovrei cercare il tipo di errori?

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

Cosa l'aveva causato nel mio caso:

Ho avuto un enorme file Foo.cpp senza Foo.h. Foo.cpp iniziato così:

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

Ho rimosso la parola chiave "statica" e Foo.h aggiunto un Foo.h con questo:

extern int var;

Vedi l'errore?

Mi mancava del tutto che var fosse originariamente definito in uno spazio dei nomi, perché la dichiarazione dello spazio dei nomi era sepolta in un altro codice. La correzione è di cambiare l'extern in questo modo:

namespace NS {
     extern int var;
}

PUNTATORI

Ho avuto questo problema e l'ho risolto usando il puntatore. Vedo che questo non era il tuo problema, ma ho pensato di parlarne perché spero davvero che sia stato qui quando l'ho visto un'ora fa. Il mio problema era di dichiarare una variabile membro statica senza definirla (la definizione doveva venire dopo alcune altre impostazioni) e ovviamente un puntatore non ha bisogno di una definizione. Ugualmente errore elementare: P


Sto facendo un po 'di C ++ per la prima volta da molto tempo, e sto ricevendo questo errore quando ho dimenticato di aggiungere il prefisso ClassName :: per la definizione della funzione, poiché questo è un po' unico per C ++. Quindi ricorda di controllare anche quello!


Oltre all'eccellente risposta di Chris Morris, ho trovato un modo molto interessante per ricevere questo stesso errore se si sta chiamando a un metodo virtuale che non è stato impostato su puro, ma non sulla sua implementazione. È lo stesso identico motivo (il compilatore non riesce a trovare un'implementazione del metodo e quindi dei truffatori), ma il mio IDE non ha colto questo difetto in minima parte.

ad esempio, il seguente codice otterrebbe un errore di compilazione con lo stesso messaggio di errore:

//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;
    }
}

Tuttavia, cambiando IamInterface myFunc () per essere un metodo virtuale puro (un metodo che "deve" essere implementato, che un metodo virtuale che è un metodo che il "can" può essere sovrascritto) eliminerà l'errore di compilazione.

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

Spero che questo aiuti la prossima persona a passare il codice!


Questo errore spesso significa che alcune funzioni hanno una dichiarazione, ma non una definizione.

Esempio:

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

// A.cpp

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

Nel tuo caso, la definizione non può essere trovata. Il problema potrebbe essere quello di includere un file di intestazione, che introduce alcune dichiarazioni di funzione, ma tu:

  1. non definire le funzioni nel tuo file cpp (se hai scritto tu stesso questo codice)
  2. non includere il file lib / dll che contiene le definizioni

Un errore comune è che si definisce una funzione come indipendente e si dimentica il selettore di classe, ad esempio A:: , nel proprio file .cpp :

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



Ho avuto gli stessi errori di collegamento, ma da un progetto di test che faceva riferimento a un'altra DLL. Ho scoperto che dopo aver aggiunto _declspec(dllexport) davanti a ciascuna funzione specificata nel messaggio di errore, il collegamento funzionava bene.


Sembra che manchi una libreria o includi, puoi provare a capire quale classe della tua libreria abbia getName, getType ecc ... e inseriscila nel file di intestazione o usando #include .

Inoltre, se questi provengono da una libreria esterna, assicurati di fare riferimento ad essi sul tuo file di progetto. Ad esempio, se questa classe appartiene ad un abc.lib allora nel tuo Visual Studio

  1. Clicca su Proprietà del progetto.
  2. Vai a Proprietà di configurazione, C / C ++, Genera, verifica che punti alla posizione abc.lib in Directory di inclusione aggiuntive. Sotto Linker, Inserisci, assicurati di avere l'abc.lib in Dipendenze aggiuntive.

Assicurati di non sovraccaricare gli operatori di inserimento o estrazione come funzioni inline. Ho avuto questo problema e è andato via solo quando ho rimosso quella parola chiave.


Ho appena visto il problema che non riesco a chiamare una funzione dal file principale in .cpp, dichiarata correttamente nel file .h e definita nel file .c. Si è verificato un errore del linker. Nel frattempo posso chiamare la funzione dal solito file .c. Forse dipende dalla convenzione di chiamata. La soluzione era aggiungere le seguenti linee di preproc in ogni file .h:

#ifdef __cplusplus
extern "C"
{
#endif

e questi alla fine

#ifdef __cplusplus
}
#endif

controlla la tua piattaforma di progetto VS è coerente con i binari che hai scaricato.

Ad esempio: Piattaforma: Win32 ---- VS2013 32bits 6.3 (statico)


Una possibile causa di questo errore del linker può anche essere funzioni inline dichiarate ma non definite in un file di intestazione che viene quindi incluso da qualche altra parte. Le funzioni inline devono essere definite in ogni unità di traduzione in cui sono utilizzate.


Assicurati di decorare i tuoi file di intestazione con

#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H

// your header code here

#endif

Le cose brutte - incluso - possono accadere se non lo fai


Ho appena avuto un momento difficile con questo. Tutto è stato configurato logicamente. Ho dichiarato un costruttore ma non l'ho definito

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

Ho quasi sbattuto la testa sulla tastiera quando ho dimenticato qualcosa di così elementare.


a volte se viene aggiunto un nuovo file di intestazione e questo errore inizia a verificarsi a causa di ciò, è necessario aggiungere anche la libreria per eliminare il unresolved external symbol .

per esempio:

#include WtsApi32.h

avrà bisogno:

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

Credo che la maggior parte dei punti riguardanti le cause e i rimedi siano stati trattati da tutti i contributori in questa discussione. Voglio solo evidenziare il mio problema "irrisolto esterno", è stato causato da un tipo di dati definito come macro che viene sostituito in modo diverso dal previsto, il che si traduce in un tipo errato fornito alla funzione in questione, e poiché la funzione con tipo non è mai stato definito, non avrebbe potuto essere risolto. In particolare, in C / C ++ -> Lingua, c'è un attributo chiamato "Treat WChar_t As Built in Type", che avrebbe dovuto essere definito come "No (/ Zc: wchar_t-)" ma non nel mio caso.


Un'altra possibilità di controllare, questa volta è stato il mio problema.

Ho aggiunto la funzione alla libreria e incluso la cartella di output della libreria nel percorso di ricerca.

Ma avevo anche una cartella con una versione precedente della libreria elencata in precedenza, quindi VS stava usando la vecchia libreria e, naturalmente, non trovava la nuova funzione.


Verifica di includere tutti i file di origine all'interno della soluzione a cui stai facendo riferimento.

Se non si include il file sorgente (e quindi l'implementazione) per il Field classe nel progetto, non verrà creato e non sarà possibile effettuare il collegamento durante la compilazione.

In alternativa, forse stai usando una libreria statica o dinamica e hai dimenticato di dire al linker di .lib s?


Da msdn.microsoft.com/en-us/library/ms242202.aspx :

Il processo di hosting di Visual Studio migliora le prestazioni del debugger e abilita nuove funzionalità di debugger, come il debug del trust parziale e la valutazione dell'espressione in fase di progettazione





c++ visual-studio visual-c++ unresolved-external