我是编程的新手,并且有一个非常基本的问题,可以在其他线程中回答,但是我认为它们太先进了,我无法理解如何。到目前为止,我实际上已经找到了许多答案,但这是迫使我创建帐户并询问的第一个问题。 无论如何,我正在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''