当前位置: 首页 > 知识库问答 >
问题:

链接错误C"未定义的引用"[重复]

年光明
2023-03-14

可能重复:
什么是未定义的引用/未解决的外部符号错误,如何修复?

试图通过g-oprog1 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;
}

搞砸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);


};

有什么想法吗?使用此函数构建具有设置大小的哈希表。

编辑:散列。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-omain.cpphash. o-std=c 0x

不知怎的,它进入了一个无限循环。

共有3个答案

艾昊明
2023-03-14

您的错误表明您没有使用insert函数的定义编译文件。更新您的命令以包含包含该函数定义的文件,并且该文件应该可以工作。

龙玄天
2023-03-14

此错误告诉您一切:

对Hash::插入(int, char)的未定义引用

您没有链接到Hash. h中定义的函数的实现。你没有一个Hash.cpp来编译和链接吗?

唐骏祥
2023-03-14

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

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

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

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

 类似资料:
  • 可能重复: 什么是未定义的引用/未解决的外部符号错误以及如何修复它? 尝试通过编译我的程序 我得到了错误: 不知怎么会进入一个无限循环。

  • 问题内容: 我可以毫无问题地创建一个共享库。我创建了libcbitcoin.so(没有错误),并尝试通过可执行文件以及OpenSSL库与之链接。我使用以下命令: bin目录是库的位置。obj目录包含我希望链接到可执行文件的目标文件。在命令中,我使用-L,-l和- rpath选项,我认为这是在Linux中进行链接所需的全部。由于出现类似以下的错误,看来我错了: 在库中找到CBNewByteArray

  • 我想知道有没有人能帮我解决这个问题--我才刚接触C++,它给我带来了很多麻烦。 我正在尝试制作相对简单的套牌和卡类对象。 错误出现在“deck.cpp”中,它声明了一个卡片数组,然后我尝试用卡片对象填充数组。它说有对、和的未定义引用。 卡d.h Card.cpp

  • 问题内容: 我在使用C ++(Eclipse)的Linux中工作,并且想要使用一个库。Eclipse显示了一个错误: 你知道解决方案吗? 这是我的代码: 问题答案: 您必须针对libdl进行链接,添加 -ldl 到您的链接器选项

  • 我有一个测试文件(仅用于链接测试),在该文件中,我用自己的/库重载/

  • 问题内容: 我对Ubuntu相当陌生,但似乎无法使它正常工作。它可以在我的学校计算机上正常工作,我不知道自己在做什么。我检查了 usr / include 和time.h就好了。这是代码: 我正在使用CodeBlocks作为我的IDE来进行构建和运行。任何帮助都会很棒,谢谢。 问题答案: 添加到g ++命令行的末尾。该链接在librt.so“实时”共享库中。