web-dev-qa-db-fra.com

Erreur de l'éditeur de liens C++ "référence non définie"

Dupliquer possible:
Qu'est-ce qu'une erreur de symbole externe non définie/référence non résolue et comment puis-je la réparer?

Essayer de compiler mon programme via g++ -o prog1 main.cpp -std=c++0x

Je reçois l'erreur:

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

Fichier Hash.h:

#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);


};

Des idées? En l'utilisant pour construire une table de hachage avec une taille définie. 

Edition: fichier 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;

}

Essayer de compiler via un terminal maintenant avec:

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

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

Il entre d'une manière ou d'une autre dans une boucle infinie.

23
Fox

Votre fichier d'en-tête Hash.h déclare "à quoi ressemblera class hash", mais pas son implémentation, qui est (probablement) dans un autre fichier source que nous appellerons Hash.cpp. En incluant l'en-tête dans votre fichier principal, le compilateur est informé de la description de class Hash lors de la compilation du fichier, mais pas du fonctionnement réel de class Hash. Lorsque l'éditeur de liens tente de créer l'ensemble du programme, il se plaint ensuite que l'implémentation (toHash::insert(int, char)) est introuvable.

La solution consiste à relier tous les fichiers ensemble lors de la création du fichier binaire du programme. Lorsque vous utilisez l'interface g ++, vous pouvez le faire en spécifiant tous les fichiers source ensemble sur la ligne de commande. Par exemple:

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

créera le programme principal appelé "main".

32
sheu

Cette erreur vous dit tout:

référence non définie àHash :: insert (int, char)

Vous ne faites pas de lien avec les implémentations des fonctions définies dans Hash.h. N'avez-vous pas un Hash.cpp pour compiler et lier également?

25
Kos

Votre erreur indique que vous ne compilez pas de fichier avec la définition de la fonction insert. Mettez à jour votre commande pour inclure le fichier qui contient la définition de cette fonction et cela devrait fonctionner.

0
Saqlain