C++链接错误 "undefined reference"

46

可能存在重复问题:
什么是“未定义的引用/未解决的外部符号”错误,我该如何修复它?

尝试通过g++ -o prog1 main.cpp -std=c++0x编译我的程序,但是出现了以下错误:

/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 文件:

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


};

有什么想法吗?使用这个来构建一个固定大小的哈希表。

编辑: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;

}

现在尝试通过终端编译:

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

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

但程序进入某种无限循环。


Hash.cpp文件在哪里?Hash::insert函数的定义在哪里? - ForEveR
问题可能是您插入了char *而不是char。我遇到了相同的错误,但据我所知,从功能上看一切都很好。继续搜索... - Nolan Robidoux
3个回答

59

您的头文件Hash.h声明了“class hash应该长什么样子”,但没有它的实现,这个实现(大概)在另一个我们称之为Hash.cpp的源文件中。通过将头文件包含在主文件中,编译器在编译文件时会被告知class Hash的描述,但不知道class Hash实际上是如何工作的。当链接器尝试创建整个程序时,它会抱怨找不到实现(toHash::insert(int, char))。

解决方案是在创建实际的程序二进制文件时将所有文件链接在一起。使用g++前端时,可以通过在命令行上指定所有源文件来实现此操作。例如:

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

将创建名为“main”的主程序。


4
如果我想分别编译两个文件,然后将它们链接起来,该怎么办?链接器无法在第二个文件中找到函数,尽管它们已经在主文件中声明。看起来 Fox 写的橙色框里的 Makefile 是正确的,但当我使用它时,它会显示“未定义的引用...”。 - Mo Sani

30

这个错误告诉你一切:

undefined reference toHash::insert(int, char)

你没有链接到在Hash.h中定义的函数的实现。难道你没有一个也要编译和链接的Hash.cpp文件吗?


0

你的错误显示你没有编译包含insert函数定义的文件。更新你的命令,包括包含该函数定义的文件,它应该可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接