使用“g++”编译 C++ 程序的“未定义引用”

"undefined reference to" using 'g++' to compile a C++ program

提问人:Zeveso 提问时间:8/8/2011 最后编辑:Peter MortensenZeveso 更新时间:5/11/2022 访问量:22456

问:

我似乎无法让错误消失。错误如下。我看过谷歌搜索,但仍然无法弄清楚。这并不是说我是 C++ 的新手,但我已经有一段时间没有玩过它了。

奇怪的是,它可以在 Windows 上使用 g++......

使用时出错:

g++ main.cpp

输出:

/tmp/ccJL2ZHE.o:在函数 Help::Help()' main.cpp:(.text+0x1d):对 Help::~Help()'
的未定义引用
main.cpp:(.text+0x46):对“Help::~Help()”的未定义引用
collect2:ld 返回 1 退出状态
main': \ main.cpp:(.text+0x11): undefined reference to Help::sayName()' \ main.cpp:(.text+0x2e): undefined reference to

文件主.cpp

#include <iostream>
#include "Help.h"

using namespace std;

int main () {

    Help h;
    h.sayName();

    // ***

    // ***

    // ***
    return 0;

}

文件 Help.h

#ifndef HELP_H
#define HELP_H

class Help {
    public:
        Help();
        ~Help();
        void sayName();
    protected:
    private:
};

#endif // HELP_H

文件帮助.cpp

#include <iostream>
#include "Help.h"

using namespace std;

Help::Help() { // Constructor
}

Help::~Help() { // Destructor
}

void Help::sayName() {
    cout << "            ***************" << endl;
    cout << "   ************************************" << endl;
    cout << "              ************" << endl;
    cout << "         *********************" << endl;
}
C G++ 未定义引用

评论

0赞 Peter Mortensen 5/11/2022
回复“奇怪的是它在 Windows 上与 g++ 一起使用......”:这是在什么平台上尝试的?它过去是否在 Windows 上有效,但现在在 Windows 上不起作用?还是在 Windows 以外的其他设备上尝试过,比如 Linux?shell 提示符建议在 Windows 或 Linux 上使用 Git BashCygwin
0赞 Peter Mortensen 5/11/2022
好吧,OP 已经离开了大楼:“最后一次露面是在 8 年多前”。我们可能永远不会知道。4 个月前的另一个问题表明,选择的平台可能是 Windows。

答:

15赞 john 8/8/2011 #1

g++ main.cpp Help.cpp

你必须告诉编译器你希望它编译的所有文件,而不仅仅是第一个文件。

8赞 Jakub M. 8/8/2011 #2

您应该将 help.o 添加到您的 g++ 行:

g++ -c help.cpp -o help.o
g++ help.o main.cpp

通过将其拆分为两行,您可以节省编译时间(对于较大的项目),因为您只能在更改时进行编译。 并且使用得当会为您省去很多麻烦:help.cppmakeMakefile

#Makefile
all: main

main: help main.cpp
    g++ -o main help.o main.cpp

help: help.cpp
    g++ -c -o help.o help.cpp
0赞 Sankalp Arora 8/24/2018 #3

我的 Linux Lubuntu 发行版也遇到了同样的问题,它为我的构造函数和析构函数带来了问题。它没有认出他们。

实际上,如果您只是将所有三个文件编译在一起,这就会消失。因此,保存所有文件后,只需执行以下操作:

g++ main.cpp Help.h Help.cpp
./a.out

./a.out 是 Linux 的可执行文件。对不起,我不知道 Windows。您的程序将顺利运行。