errore linker: riferimento indefinito c ++
Domanda
Ho provato a esaminare problemi simili, ma non sono riuscito a trovarne facilmente uno che mi abbia aiutato.
Ho creato un progetto in C ++ e sto lavorando su UNIX per compilarlo, collegarlo ed eseguirlo. Il mio problema specifico è un riferimento indefinito a un metodo che dichiaro in un file separato.
Nel file SharedCache.cpp, ho il seguente metodo:
int SharedCache::replaceLine(ullong address){
int evictPID = -1;
int cacheSet = calcCacheSet( address );
//random uniformly-distributed value for cache line
float numLines = static_cast<float>(CACHE_LINES_PER_SET);
uint cacheLine = static_cast<uint>(uniformDistr( numLines ));
if(cache[cacheSet][cacheLine] != NULL){
evictPID = cache[cacheSet][cacheLine]->PID;
}
uint PID= calcPID(address);
uint tag= calcTag(address);
cache[cacheSet][cacheLine]->setLine(PID, tag); //mutex method
return PID;
}
La linea uint cacheLine = static_cast<uint>( uniformDistr( numLines ));
effettua una chiamata alla funzione che voglio usare da un altro file. L'errore del linker è un riferimento indefinito a questo metodo.
uniformDistr (float); è dichiarato nell'intestazione distributions.h e definito in distributions.cpp. Nelle opzioni del mio progetto ho impostato il flag linker -distributions e ho anche compilato il file distribututions.cpp per assicurarmi che esista un file distribututions.o con cui collegarsi.
Da qui, non so dove andare, perché questo non ha risolto il problema.
Soluzione
Non ho usato KDevelop, tuttavia, dalla riga di comando aggiungeresti semplicemente distributions.o come file di input al processo di collegamento. Non c'è bisogno di trattini o di lasciare l'estensione .o.
In alternativa, puoi semplicemente aggiungere distributions.cpp al tuo progetto KDevelop? In questo modo dovrebbe essere compilato e collegato automaticamente (è così che funziona in Visual Studio o Eclipse).
Altri suggerimenti
Senza informazioni più precise su quali comandi del compilatore / linker siano stati richiamati e che vengano visualizzati esattamente gli errori, è difficile fornire una buona risposta.
Tuttavia, dalla tua descrizione di ciò che hai fatto, sembra che non passi distributions.o
al linker. A differenza di altre lingue in cui il compilatore / linker cerca automaticamente i file oggetto da collegare, i linker C ++ richiedono una specifica esplicita degli oggetti da collegare insieme.
L'uso di -ldistributions qui non è corretto: il flag -l viene utilizzato per collegarsi a una libreria statica o dinamica (rispettivamente file .a e .so su Linux), mentre si desidera specificare un altro file oggetto che il linker dovrebbe considerare. Se si specifica -ldistributions
, il linker cerca distributions.a
o distributions.so
nelle posizioni standard della libreria.
Fondamentalmente, la tua chiamata al linker ora assomiglia a questa (probabilmente con molte più bandiere e librerie):
gcc -o my_program SharedCache.o -ldistributions
Per collegare correttamente il codice delle distribuzioni, è necessario renderlo simile a (di nuovo, molte bandiere e librerie probabilmente mancano rispetto alla cosa reale):
gcc -o my_program SharedCache.o distributions.o
Questo dovrebbe risolvere il problema dei simboli mancanti e produrre un binario funzionante (o almeno un errore diverso ;-)). Come farlo in KDevelop, tuttavia non lo so.
Hai aggiunto distributions.cpp al tuo makefile? Inoltre credo che il flag del linker richiesto sia -ldistributions
.