为什么我得到"未定义的对主"

时间:2018-02-23 02:43:34

标签: c++ linux codeblocks main

我是一个非常新的编程,有一个非常基本的问题,可以在其他主题中回答,但我认为它们太先进了,我不能理解。到目前为止,我在这个网站上找到了很多答案,但这是第一个迫使我创建帐户问题的问题。   无论如何,我正在运行一个关于linux mint 18.3的非常基本的示例程序。现在我已经看到这个确切的代码在Windows 8的机器上运行我相信所以我想知道这是否可能是问题。我创建了一个类,当我插入我的对象然后构建并运行我得到:

/ usr / lib / gcc / x86_64-linux-gnu / 5 /../../../ x86_64-linux-gnu / crt1.o ||在函数_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 / Gladius.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:在函数_start': (.text+0x20): undefined reference to main&#39; collect2:错误:ld返回1退出状态

6 个答案:

答案 0 :(得分:1)

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

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的文件),那么您将收到当前正在获取的链接器错误。

答案 1 :(得分:1)

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

-c选项&#34;吞下&#34;你的-I选项。 -I需要一个附加参数,它是一个包含目录名。您未能提供该参数,这就是-c假定其后面的-I是目录名称的原因。因此-c会消耗-c

编译器永远不会看到-c。如果没有Gladius.cpp,则假定您要编译并链接您的程序。由于main中没有-I,因此您会在链接阶段收到错误。

以下是同一问题的简单演示:http://coliru.stacked-crooked.com/a/8a37cd3e90a443e2

您需要弄清楚为什么在命令行中有一个孤立的=IF(AND(Z4=0,D4=0),0,IF(AND(Z4=0,D4>0),1,IF(AND(Z4=0,D4<0),-1,(D4-Z4)/ABS(Z4))))

答案 2 :(得分:0)

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

$ g ++ main.cpp gladius.cpp -odemo

$ ./demo

答案 3 :(得分:0)

检查你的命令行是否有链接步骤..你可能忘记了带有main作为输入的文件,或者你忘记了输出文件名后面的-o(并且结果中掩盖了main.o)

答案 4 :(得分:0)

了解编译器选项(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”和“Gladius.o”生成可执行文件

 g++ -Wall -fexceptions -g -std=c++11 -o main main.o Gladius.o

现在你可以运行“main”:

./main

答案 5 :(得分:0)

我自己也遇到过这种问题,虽然这可能不是传统的“正确”解决方案,但我只是将“.c”文件重命名为“.cpp”,一切正常。

毕竟,我使用 c++ 编译器(库推荐)同时编译 c 和 c++,并且 c 代码已经具有正确的 c++ #extern 标志(有关更多信息,请参阅 here那个)。

还相关: