C++中的错误信息 "Undefined reference error to"

3

我在C++中的一个类方法中遇到了undefined reference错误。错误信息为:“undefined reference to 'Department::getNameabi:cxx11',并且每个department方法调用都有类似的多行错误信息。

#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
2个回答

12

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 中传递给链接器。


0

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

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

我已经在我的主类中包含了 "departmen.h"。 - Bipul Adh

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