2011-08-25 118 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而不是目標文件.... :)