Frage

Ich habe versucht, auf ähnliche Probleme suchen, konnte aber nicht leicht zu finden, die mein Problem geholfen.

Ich habe ein Projekt in C ++ erstellt und auf UNIX arbeite zu kompilieren, Link, und führen Sie es. Mein spezielles Problem ist ein undefinierter Verweis auf eine Methode, die ich in einer separaten Datei deklarieren.

In der Datei SharedCache.cpp, ich habe die folgende Methode:

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

Die Linie uint cacheLine = static_cast<uint>( uniformDistr( numLines )); macht einen Aufruf der Funktion, die ich aus einer anderen Datei verwenden möchten. Der Linker Fehler ist eine nicht definierte Verweis auf diese Methode.

uniformDistr (float); im Header distributions.h und definiert in distributions.cpp erklärt. In meinem Projekt Optionen ich den Linker-Flag -distributions und ich auch die distributions.cpp kompilierte eine distributions.o Datei existiert mit, um sicherzustellen, zu verknüpfen.

Von hier, ich weiß nicht, wohin sie gehen, weil dies das Problem nicht gelöst hat.

War es hilfreich?

Lösung

Ich habe nicht verwendet KDevelop jedoch auf der Kommandozeile würden Sie nur als Eingabedatei zu der Verknüpfung hinzufügen distributions.o. Keine Notwendigkeit für Striche oder die .o Verlängerung Weglassen.

Alternativ können Sie nur distributions.cpp zu Ihrem KDevelop Projekt hinzufügen? Auf diese Weise sollte es automatisch kompiliert und verlinkt wird (dies ist, wie es in Dinge wie Visual Studio oder Eclipse funktioniert).

Andere Tipps

Ohne genauere Informationen zu dem Compiler / Linker-Befehle aufgerufen wurden und die genauen Fehlerausgänge, ist es schwierig, eine gute Antwort zu geben.

Doch aus Ihrer Beschreibung von dem, was Sie getan haben, so scheint es, dass Sie nicht distributions.o an den Linker sind vorbei. Im Gegensatz zu anderen Sprachen, in denen die Compiler / Linker Suche nach Objektdateien automatisch zu verknüpfen in, C ++ Linker erfordert eine explizite Angabe der Objekte miteinander zu verknüpfen.

Ihre Nutzung von -ldistributions hier ist falsch: der -l-Flag auf eine statische oder dynamische Verknüpfung verwendet wird, Bibliothek (bzw. .a und .so-Dateien unter Linux), während Sie angeben mögen, ein weiteres Objektdatei , dass der Linker in Betracht ziehen sollten. -ldistributions Angeben macht den Linker sucht distributions.a oder distributions.so in der Standardbibliothek Standorten.

Im Grunde Ihre Linker Aufruf sieht nun so etwas wie diese (wahrscheinlich mit vielen anderen Flaggen und Bibliotheken):

gcc -o my_program SharedCache.o -ldistributions

, um eine Verknüpfung korrekt die Verteilungen Code in, Sie müssen es so etwas wie (wieder viele Fahnen und Bibliotheken wahrscheinlich im Vergleich zu fehlen die realen Sache) aussehen:

gcc -o my_program SharedCache.o distributions.o

Dies sollte die fehlenden Symbole Problem beheben und eine Arbeits binary (oder zumindest einen anderen Fehler ;-)) erzeugen. Wie dies jedoch in KDevelop zu tun, weiß ich nicht.

Haben fügen Sie die distributions.cpp zu Ihrem Make-Datei? Auch glaube ich, der erforderliche Linker-Flag -ldistributions.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top