2011-08-25 119 views
3

我学习C++,我得到这个错误:奇怪的“未定义符号”错误?

Undefined symbols: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

我的代码是这样的

#include <stdlib.h> 
    #include <iostream> 

    class Fraction { 
     private: 
      int num, den; 
     public: 
      void set(int n, int d) {num=n; den=d; normalize();} 
      int get_num(){return num;} 
      int get_den(){return den;} 
     private: 
      void normalize(); 

      int gcf(int a, int b); 
      int lcm(int a, int b); 
    }; 

    void Fraction::normalize() { 
     if (den == 0 || num == 0) { 
      num = 0; 
      den = 1; 
     } 

     if (den < 0) { 
      num *= -1; 
      den *+ -1; 
     } 

     int n = gcf(num, den); 
     num = num/n; 
     den = den/n; 
    } 

    int Fraction::gcf(int a, int b) { 
     if (a % b == 0) 
      return abs(b); 
     else return gcf(b, a % b); 
    } 
    int Fraction::lcm(int a, int b) { 
     return(a/gcf(a, b)) * b; 
    } 

如果有帮助的所有,我使用GCC与命令g++ -o

任何帮助非常感谢!

+0

你已被告知下面的答案。但我很好奇,因为这个程序不包含主要功能,你期望它做什么?我们或许正在创建一个图书馆,以后可以在另一个程序中使用它?如果是这样,那么添加主要功能不是正确的做法。 – john

+2

@minitech我怀疑我可以@编辑这样的正确,但我留下了深刻的印象,只是想说:) – Paulpro

+0

我注意到你写了'den * + -1'那里而不是'den * = -1 '。如果这是您的实际代码,请更改它。 – Ryan

回答

4

main功能在哪里? C++中的每个“普通”程序都从main函数开始,这就是链接程序正在寻找的原因。你还没有提供它。因此错误。

2

我认为问题在于你编译的源文件不包含main函数。并非每个源文件都必须定义main,但每个C++程序都需要将它放在某处,并且由于您没有发布任何其他源文件,我会假设这是您唯一的文件。如果您尝试编译和链接此代码,则会出现错误,因为程序中没有入口点。

要解决此问题,请将您的代码与包含main函数的文件链接在一起,或者将代码添加到main函数中,或编译代码而不链接它(这取决于您的编译器)。

此外,您应该将您的代码拆分为.h/.cpp对。通常来说,类是在头文件中定义的,以便它们可以被程序的其他部分使用,而实现则留在.cpp文件中,以便它们对客户端不可见。

+2

实际上,编译器检测到他的缩进非常糟糕,以至于它拒绝编译并抓住它可以找到的最接近的错误,这是他得到的错误。你的答案的第一句也有点含糊,因为每个源文件都不必具有'main'函数。 –

+0

@Seth Carnegie-啊,好点!澄清。 – templatetypedef

0

几乎每个C++函数都有一个main函数,它告诉计算机应该先执行哪部分代码。否则,如果有人启动你的程序,它应该从哪里开始?它具有如下形式:

int main(int argc, char **argv) { 
    //what should happen when someone runs the program? 
    //that goes here 
    return 0; //program all done 
} 
0

使用gcc时添加-c标志;它停止编译器寻找的主要功能

0

我觉得你必须改变ü使用的文件的扩展名“的.h”而不是“的.cpp”

例如: 如果这个文件被命名为作为abc.cpp和我编译它的方式“gcc abc.cpp”,那么你必须将其改为“gcc abc.h”......

这将指示编译器编译Header而不是目标文件.... :)