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

链接器错误C++“未定义引用”[重复]

徐晔
2023-03-14

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

尝试通过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
#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;
}
#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);


};
#include <iostream>
#include <cstring>
#include "Hash.h"

using namespace std;

void Hash::insert(int key, char value){
*hashFN[key]->addFront(value);
cout << "Success!" << endl;

}

不知怎么会进入一个无限循环。

共有1个答案

谭安翔
2023-03-14

您的头文件hash.h声明了“类hash应该是什么样子的”,但不声明它的实现,它(大概)在我们将称为hash.cpp的其他源文件中。通过将头包含在主文件中,编译器在编译文件时会获知类哈希的描述,但不会获知类哈希实际上是如何工作的。当链接器尝试创建整个程序时,它会抱怨找不到实现(tohash::insert(int,char))。

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

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

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

 类似资料:
  • 可能重复: 什么是未定义的引用/未解决的外部符号错误,如何修复? 试图通过 我得到一个错误: main.cpp 搞砸h文件: 有什么想法吗?使用此函数构建具有设置大小的哈希表。 编辑:散列。cpp文件 正在尝试通过以下终端进行编译: g-c Hash.cpp-o Hash. o g-omain.cpphash. o-std=c 0x 不知怎的,它进入了一个无限循环。

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

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

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

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

  • 我正在尝试使用mySQL c连接器。我已经按照mysql指南https://dev . MySQL . com/doc/connector-CPP/8.0/en/connector-CPP-installation-binary . html下载并解压了二进制文件 当我包括 xdevapi 像这样 我得到以下错误 /tmp/cc6dzD4k.o:在函数` mysqlx::string::opera