Domanda

Sono un fallimento inumatico in c ++ e vs, e non riesco a capire cosa sto facendo male, e soprattutto come aggiustarlo.

Sto lavorando su una soluzione con più progetti e ora sto iniziando a utilizzare le classi da un progetto in un altro. Tuttavia, sto ottenendo questo errore:

.

tlibdecoder.lib (tdeccu.obj): Errore LNK2001: Aresolto esterno Symbol "Public: Void __thiscall CureGister :: Registercu (INT, INT, INT)" (? Registercu @ curegister @@ qaexhhh @ z)

Il problema sembra essere la funzione che sto usando in tdeccu.cpp, che proviene dai file curegister.h e curegister.cpp.

in cima a CureGister.Cpp ho incluso CureGister.h, quindi la funzione è definita (posso usarlo normalmente all'interno dello stesso progetto di JSUT importazione curaregire.h), ma quando includo l'intestazione in tdeccu.cpp (aggiungendo #include "curegister.h" nella parte superiore) Sembra che ci sia un problema.

Qualcuno può dirmi come risolvere questo? Tieni presente che sono inesperto, quindi non importa spiegarlo davvero semplice;)

Grazie in anticipo. B

È stato utile?

Soluzione

Un "errore di simbolo irrisolto" è un errore linker , al contrario di un errore Compiler . Il collegamento è la seconda fase di ciò che sembra essere un singolo evento "build" in un IDE come Visual Studio.

Il problema centrale qui riguarda La distinzione tra < EM> Dichiarazioni e Definizioni in C ++ . In breve, una dichiarazione introduce un simbolo (come una funzione) al compilatore , mentre a definizione fornisce l'istanziazione / implementazione effettiva di quel simbolo Per il linker . Quando si considera una funzione, la definizione è ciò che probabilmente hai sentito indicato come prototipo. Qualcosa del genere:

void registerCu(int x, int y, int depth);
.

Si noti che non fornisce l'implementazione per la funzione, quindi è solo una definizione. È diverso da una dichiarazione, che fornisce la piena attuazione:

void registerCu(int x, int y, int depth)
{
    // do magic stuff here  
}
.

Se questo fosse un singolo progetto autonomo, è possibile presumere che l'errore del linker ti avvisa ti avvisa che non è stato possibile fornire una definizione della funzione. Ciò probabilmente significa che hai scritto un prototipo in un'intestazione da qualche parte, ma in realtà non ha scritto il contenuto della funzione in un file .cpp corrispondente.

Ma dal momento che i tuoi commenti per la risposta di infatti indicano che hai effettivamente fornito l'implementazione in un file .cpp, e la domanda dice che stai lavorando con più progetti, è più probabile che secondo il progetto non è in grado di trovare la definizione della funzione. Hai incluso l'intestazione dal primo progetto che fornisce la dichiarazione al secondo progetto, quindi il compilatore è felice. Ma quando il linker viene in giro per cercare di collegare il codice dell'oggetto per quella chiamata di funzione, si scontra iluso perché non riesce a trovare la definizione.

Fissare questo istruendo il linker per il secondo progetto di esaminare il codice oggetto per il primo progetto per qualsiasi definizione che non riesce a trovare. Generalmente lo fai aggiungendo il percorso della cartella che contiene l'output di build per il primo progetto alle impostazioni del linker per il tuo secondo progetto.

Altri suggerimenti

Dovresti aggiungere sia CureGister.H e CureGister.cpp al progetto in cui Tdeccu.CPP si trova in.

.h contiene solo la dichiarazione mentre .CPP Contains Implementation, quando viene compilato un progetto, il compilatore cercherà di trovare tutto il necessario implementazione dai file di progetto o da alcuni file libi referenziati dal progetto.

Se appena includi .h nel tuo file, non c'è modo di rendere il compilatore di localizzare la sua implementazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top