错误消息"Undefined reference error to" C++

Error message "Undefined reference error to" in C++

本文关键字:to C++ error Undefined 消息 错误 reference      更新时间:2023-10-16

我正在获得C++中一个类方法的未定义引用。错误是"未定义对'部门::getNameabi:cxx11'的引用,以及部门每个方法调用的其他许多行。

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include "department.h"
using namespace std;
void addDepartment();
void writeToFile();
void showArt();
void removeDepartment();
vector <Department> departments;

int main()
{
int choice;
do
{
cout << "1)Add asset t 2)Remove Asset t 3)Departmental Options t 4)Quit" << endl;
cin >> choice;
switch(choice)
{
case 1: addDepartment();
break;
case 2: removeDepartment();
break;
case 3: //showReport();
break;
}
addDepartment();
} while(choice != 4);
}
void showArt()
{
cout << "ASSET MANGEMENT" << endl;
}
void addDepartment()
{
string name;
cout << "Enter department name" << endl;
cin >> name;
vector<Department>::iterator it;
int flag = 0;
for(it = departments.begin(); it!=departments.end(); it++)
{
if (it->getName().compare(name) == 0)
{
flag = 1;
it->addAsset();
break;
}
}
if (flag == 0)
{
Department temp(name);
temp.addAsset();
departments.push_back(temp);
}
}
void removeDepartment()
{
string name;
cout << "Enter department name" << endl;
cin >> name;
vector<Department>::iterator it;
int flag = 0;
for(it = departments.begin(); it!=departments.end(); it++)
{
if (it->getName().compare(name) == 0)
{
flag = 1;
it->removeAsset();
break;
}
}
if (flag == 0)
{
cout << "No such department puta!" << endl;
}
}

我部门的头文件如下:

#ifndef DEPARTMENT_H
#define DEPARTMENT_H
#endif
#include <cstring>
#include <vector>
#include <string>
#include "computer.h"
#include "software.h"
using namespace std;
class Department
{
string name;
vector<Computer> computers;
vector<Software> softwares;
void addComputer();
void addSoftware();
public:
Department(string);
void addAsset();
void removeAsset();
string getName();
};

错误

bipgen@genbox:~/asset-management$ g++ -std=c++11 main.cpp
/tmp/ccvu6doW.o: In function `addDepartment()':
main.cpp:(.text+0x181): undefined reference to `Department::getName[abi:cxx11]()'
main.cpp:(.text+0x1cd): undefined reference to `Department::addAsset()'
main.cpp:(.text+0x220): undefined reference to `Department::Department(std::__cxx11::basic_string<char, std::char_traits<char>, std::a
llocator<char> >)'
main.cpp:(.text+0x23b): undefined reference to `Department::addAsset()'
/tmp/ccvu6doW.o: In function `removeDepartment()':
main.cpp:(.text+0x392): undefined reference to `Department::getName[abi:cxx11]()'
main.cpp:(.text+0x3d8): undefined reference to `Department::removeAsset()'
collect2: error: ld returned 1 exit status

Department的所有成员函数都只声明,没有定义。

这意味着编译器承认它们的存在并编译main.cpp,在调用它们的地方,没有任何麻烦。

当编译器完成其工作时,轮到链接器将函数的实现"粘合"到它们的调用中。但它找不到实现,所以它理所当然地抱怨。


现在,我想你不只是声明了成员函数而忘记定义它们。您很可能将定义放在一个名为department.cpp的单独文件中,如下所示:

#include "department.h"
void Department::addSoftware() {
// implementation
}
Department::Department(string) {
// implementation
}
void Department::addAsset() {
// implementation
}
void Department::removeAsset() {
// implementation
}
string Department::getName() {
// implementation
}

您可能还认为,main.cpp包含department.h会以某种方式神奇地从department.cpp中提取代码。

但这不是C++(或典型的C++工具链)的工作方式。链接器不知道源自其他文件中源代码的任何实现,除非您告诉它。事实上,在您的情况下,即使是编译器也不知道它们。

需要编译department.cpp并将生成的二进制代码传递给链接器。这样做的快速方法是:

g++ -std=c++11 main.cpp department.cpp

迟早,你会需要一个更复杂的过程,其中每个*.cpp文件被编译成一个*.o文件,然后将*.o文件传递给链接器,所有这些都发生在一个 Makefile 中。

部门类实现是否包含在编译中?

g++ -std=c++11 main.cpp department.cpp