web-dev-qa-db-de.com

Linker-Fehler C++ "undefinierte Referenz"

Mögliches Duplizieren:
Was ist ein undefinierter Verweis/ein nicht gelöstes Symbol für ein externes Symbol und wie kann ich es beheben?

Versuch, mein Programm über g++ -o prog1 main.cpp -std=c++0x zu kompilieren

Ich bekomme den Fehler:

/tmp/cc1pZ8OM.o: In function `main':
main.cpp:(.text+0x148): undefined reference to `Hash::insert(int, char)'
collect2: error: ld returned 1 exit status

main.cpp

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <functional>
#include "Hash.h"

using namespace std;

int main(int argc, char *argv[]) {
//preset prime number 
int prime = 101;
hash<char> h1;
int key;
Hash HashTable;

// check for Request & string parameters
if(argc != 3) {
    cout << "Run program with 2 parameters. [Lower Case]" << endl;
    cout << "[1] insert, find, or delete" << endl;
    cout << "[2] string" << endl;
}

if(strcmp(argv[1], "insert") == 0) {
    //Get Hash for argv[2] aka value
    key = h1(*argv[2]);

    //check 1
    cout << "Hash: " << key << endl;

    key = key % prime;

    //check 2
    cout << "Mod 101 Hash: " << key << endl;

    HashTable.insert(key, *argv[2]); //PROBLEM here

}

return 0;
}

Hash.h-Datei:

#include <iostream>
#include <cstring>
#include "LinkedList.h"
using namespace std;

class Hash {
//100 slot array for hash function
LinkedList *hashFN[100];

public:
void insert(int key, char value);
//void deleteItem(int key);
//char* find(int key);


};

Irgendwelche Ideen? Verwenden Sie dies, um eine Hashtabelle mit festgelegter Größe zu erstellen. 

Bearbeiten Sie die Datei Hash.cpp

#include <iostream>
#include <cstring>
#include "Hash.h"

using namespace std;

void Hash::insert(int key, char value){
*hashFN[key]->addFront(value);
cout << "Success!" << endl;

}

Versucht jetzt über Terminal zu kompilieren mit:

g ++ -c Hash.cpp -o Hash.o

g ++ -o prog1 main.cpp Hash.o -std = c ++ 0x

Es geht irgendwie in eine unendliche Schleife.

23
Fox

Ihre Header-Datei Hash.h deklariert "wie class hash aussehen soll", aber nicht deren Implementierung, was (vermutlich) in einer anderen Quelldatei liegt, die wir Hash.cpp nennen. Wenn Sie den Header in Ihre Hauptdatei aufnehmen, wird der Compiler beim Kompilieren der Datei über die Beschreibung von class Hash informiert, nicht jedoch darüber, wie class Hash tatsächlich funktioniert. Wenn der Linker versucht, das gesamte Programm zu erstellen, beanstandet er, dass die Implementierung (toHash::insert(int, char)) nicht gefunden werden kann.

Die Lösung besteht darin, beim Erstellen des eigentlichen Programm-Binärprogramms alle Dateien miteinander zu verknüpfen. Wenn Sie das g ++ - Frontend verwenden, können Sie dies, indem Sie alle Quelldateien zusammen in der Befehlszeile angeben. Zum Beispiel:

g++ -o main Hash.cpp main.cpp

erstellt das Hauptprogramm namens "main".

32
sheu

Dieser Fehler sagt Ihnen alles:

undefinierter Verweis aufHash :: insert (int, char)

Sie verknüpfen nicht mit den Implementierungen von Funktionen, die in Hash.h definiert sind. Haben Sie keinen Hash.cpp, der auch kompiliert und verlinkt wird?

25
Kos

Ihr Fehler zeigt an, dass Sie keine Datei mit der Definition der Funktion insert kompilieren. Aktualisieren Sie Ihren Befehl, um die Datei einzuschließen, die die Definition dieser Funktion enthält, und es sollte funktionieren.

0
Saqlain