当前位置: 首页 > 面试题库 >

在Linux Mint中使用g ++导致对'Class :: Function'的未定义引用(collect2:错误)

薛华奥
2023-03-14
问题内容

另外stoi和exit(0)都在stk.cpp中超出范围,我不知道为什么。

这是main.cpp

#include "stk.h"

int main()
{
    cout << "REDACTED\n" << endl;
    stk m;
    m.startProg();

}

使用g++ -v main.cpp -o test as 编译时会导致此错误:

undefined reference to 'stk::startProg()'
collect2: error: ld returned 1 exit status

这是stk.h

#ifndef STK_H
#define STK_H

#include <iostream>
#include <string>
#include "stdio.h"

using namespace std;


class stk
{
    struct node
    {
        int data;
        node * next;
    };
    node *head;

    public:
        stk()
        {
            head = NULL;
        }
        int push(int val);
        int pop();
        int display();
        int reverse(node * temp);
        void insertAtBottom(int tVal, node * temp);
        bool isEmpty();
        int startProg();
    private:
};

#endif

这是stk.cpp中的startProg函数

    int stk::startProg()
 {
    while (true)
    {
        string line = "\0";
        getline(cin, line);

        if (0 == line.compare(0,4, "push"))
        {
            int val = 0;
            val = stoi(line.substr(5));
            push(val);
        }
        else if(0 == line.compare (0,3, "pop"))
        {
            pop();
        }
        else if (0 == line.compare(0,7, "isempty"))
        {
            printf ("%s\n", isEmpty() ? "true" : "false");
        }
        else if (0 == line.compare(0,7, "reverse"))
        {
            node * top = NULL;
            reverse(top);

        }
        else if (0 == line.compare(0,7, "display"))
        {
            display();
        }
        else if (0 == line.compare(0,4, "quit"))
        {
            exit(0);
        }

格式化失败,我假设所有括号都正确。


问题答案:

问题是您在创建可执行文件时 没有 链接来自stk.cpp的代码。

解决方案1:首先编译.cpp文件,然后链接。

g++ -c main.cpp
g++ -c stk.cpp
g++ main.o stk.o -o test

解决方案2:一步编译并链接两个文件。

g++ main.cpp stk.cpp -o test


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

  • 我终于绝望了。所以,在我的c课上,我们被指示使用类。我们会让头文件声明类和函数,而另一个单独的. cpp文件实现它。事情应该是有效的,但他们没有,网上没有解决方案似乎对我有用。为此,我在linux上使用了G编译器,它似乎在IDE或普通命令行上都无法工作。 我在笔记本上看到的错误。h是这样的: 我有点不喜欢该文件没有接收任何电话类的方法。下面是TBook的代码。h: 这就是TBook.cpp的样子:

  • 试图按照官方手册实现一个模块时,我收到了以下错误消息: 但在我的代码中没有任何地方使用过这个名称。 我该怎么解决这个?

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

  • 我正在尝试使用AassetManager从android apk访问资产。然而,尽管我已经包含了asset_manager.h和asset_manager_jni.h,但我仍然得到了“对aassetmanager_fromjava的未定义引用”。其他来自asset_manager.h的函数,如AAssetManager_openDir(mgr,"“)等也不能被引用。 以下是完整的代码 这段代码在一

  • 错误:未定义对'pthread_cancel'的引用