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.
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".
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?
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.