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.

È stato utile?

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.

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