为什么我会"undefined reference to main"



我是编程的新手,并且有一个非常基本的问题,可以在其他线程中回答,但是我认为它们太先进了,我无法理解如何。到目前为止,我实际上已经找到了许多答案,但这是迫使我创建帐户并询问的第一个问题。 无论如何,我正在Linux Mint 18.3上运行一个非常基本的示例程序。现在,我已经看到了带有Windows 8的机器上的此确切的代码工作,我相信我想知道这是否可能是问题所在。我创建了一个类,当我插入对象然后构建并运行时,我会得到:

/usr/lib/gcc/x86_64-linux-gnu/5/../../../../x86_64-linux-gnu/crt1.o || in Function _start':| (.text+0x20)||undefined reference to main'|

这是整个代码:

#include <iostream>
#include "Gladius.h"
using namespace std;
int main()
{
    Gladius io;
    return 0;
}

那是非常基本的。这是.h

#ifndef GLADIUS_H
#define GLADIUS_H

class Gladius
{
    public:
        Gladius();
};
#endif // GLADIUS_H

和班级的.cpp。

#include "Gladius.h"
#include <iostream>
using namespace std;
Gladius::Gladius()
{
    cout << "The Gladius is a short sword" << endl;
}

我知道这似乎非常简单,但是我只是在学习编码,我一直在寻找一个解释,为什么它不起作用,但我看到它完全可以在另一台PC上工作。无论如何,任何解释都将不胜感激。

,如果这回答了您对CMD中的内容的问题,这是我在命令行中发现的。

g -wall -fexceptions -G -STD = C 11 -WALL -I -C/HOME/GATOR/DOCUMENTS/SPARTAN1/GLADIUS.CPP -O obj/debug/debug/debug/glagius.o/USR/lib/gcc/x86_64-linux-gnu/5/../../../../../../../x86_64-linux-gnu/crt1.o:在函数 _start': (.text+0x20): undefined reference to main'Collect2:错误:LD返回1退出状态

知道编译器选项(gcc/g 编译器(:

  • -c:编译和组装,但不要链接
  • -o 文件:将输出放入文件

所以当您运行

g++ filename.cpp -o executable_name

,您生成一个可以执行的应用程序。

问题是您正在编译,组装以及在尝试编译" gladius.cpp"时链接,并且编译器正在尝试搜索main((定义。

因此,在您的情况下,汇编步骤将是:

第一个编译" gladius.cpp"并生成对象文件" gladius.o":

g++ -Wall -fexceptions -g -std=c++11 -c Gladius.cpp

下一个编译" main.cpp"并生成对象文件" main.o":

g++ -Wall -fexceptions -g -std=c++11 -c main.cpp

通过链接" main.o"one_answers" gladius.o"

生成可执行文件
 g++ -Wall -fexceptions -g -std=c++11 -o main main.o Gladius.o

现在您可以运行" main":

./main

您的编译器的命令行包含-I -c序列。

-I选项"吞咽"您的-c选项。-I需要一个其他参数,这是一个包含目录名称。您无法提供该参数,这就是为什么-I假设遵循其目录名称的-c。因此-I消耗了-c

编译器从未看到-c。没有-c,它假设您要编译并链接您的程序。由于Gladius.cpp没有main,因此您在链接阶段会出现错误。

此处的一个简单的演示相同问题:http://coliru.stacked-crooked.com/a/a/8a37cd3e90a4443e2

您需要弄清楚为什么在命令行中有孤儿-I

如果您使用命令行编译此代码:

g++ -Wall -Wextra -Werror -O gladius.cpp -o output.exe

然后确保包含包含您程序需要的代码的所有.cpp文件(不是.h文件(。

g++ -Wall -Wextra -Werror -O gladius.cpp main.cpp -o output.exe

我一直向初学者解释这一点,因为每个.cpp都是一袋乐高。您需要盒子随附的所有袋子才能建造套件。如果您省略了main.cpp(或包含main的文件(,则将获得当前遇到的链接器错误。

您使用什么命令来编译,链接然后执行?它应该看起来像

$ g main.cpp gladius.cpp -odemo

$ ./demo

检查您的命令行以链接步骤..您可能会忘记使用main as Input的文件,或者在-o之后忘记了输出文件名(和结果蒙版main.o(

我本人遇到了这种问题,尽管这可能不是常规的"正确"解决方案,我简单地重命名为" .c"。归档到" .cpp",并且所有这些都起作用。

毕竟,我将C 编译器一起编译C (由库推荐(,并且C代码已经具有正确的C #extern标志(有关更多信息,请参见此处(。

>

也相关:

  • c 错误:未定义的引用`main'
  • 在C 中包括C代码
  • 为什么您需要明确的`-lm`编译器选项
  • linux上的汇编 - 在函数'_start'中:(.Text 0x20(:未定义的引用'main''

相关内容

  • 没有找到相关文章

最新更新