Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linker Error C++ "undefined reference " [duplicate]

Possible Duplicate:
What is an undefined reference/unresolved external symbol error and how do I fix it?

Trying to compile my program via g++ -o prog1 main.cpp -std=c++0x

I get the error:

/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 file:

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

Any ideas? Using this to build a hash table with set size.

Edit: Hash.cpp file

#include <iostream> #include <cstring> #include "Hash.h"  using namespace std;  void Hash::insert(int key, char value){ *hashFN[key]->addFront(value); cout << "Success!" << endl;  } 

Trying to compile via terminal now with:

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

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

It goes into an infinite loop somehow.

like image 629
Fox Avatar asked Jan 28 '13 07:01

Fox


People also ask

How do I fix undefined reference linker error?

So when we try to assign it a value in the main function, the linker doesn't find the symbol and may result in an “unresolved external symbol” or “undefined reference”. The way to fix this error is to explicitly scope the variable using '::' outside the main before using it.

How do you fix undefined reference error in C?

Used the GCC compiler to compile the exp. c file. The error: undefined reference to function show() has appeared on the terminal shell as predicted. To solve this error, simply open the file and make the name of a function the same in its function definition and function call.

How do you resolve undefined references in C++?

You can fix undefined reference in C++ by investigating the linker error messages and then providing the missing definition for the given symbols. Note that not all linker errors are undefined references, and the same programmer error does not cause all undefined reference errors.

What is linking error in C?

Linker errors are the errors encountered when the executable file of the code can not be generated even though the code gets compiled successfully. This error is generated when a different object file is unable to link with the main object file.


2 Answers

Your header file Hash.h declares "what class hash should look like", but not its implementation, which is (presumably) in some other source file we'll call Hash.cpp. By including the header in your main file, the compiler is informed of the description of class Hash when compiling the file, but not how class Hash actually works. When the linker tries to create the entire program, it then complains that the implementation (toHash::insert(int, char)) cannot be found.

The solution is to link all the files together when creating the actual program binary. When using the g++ frontend, you can do this by specifying all the source files together on the command line. For example:

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

will create the main program called "main".

like image 167
sheu Avatar answered Oct 15 '22 01:10

sheu


This error tells you everything:

undefined reference toHash::insert(int, char)

You're not linking with the implementations of functions defined in Hash.h. Don't you have a Hash.cpp to also compile and link?

like image 34
Kos Avatar answered Oct 15 '22 01:10

Kos