2012-09-06 174 views
0

我是C++的初學者,我正在編寫一個程序來尋找最大的公因子。在主,我有:C++無法編譯文件

#include <iostream> 
#include <cstdlib> 
#include "longgcd.cpp" 
int main(int argc, char* argv[]){ 
    long gcd(long m, long n); 
    long m,n,g; 
    m=atol(argv[1]); 
    n=atol(argv[2]); 
    g=gcd(m,n); 
    std::cout<<"gcd("<<m<<","<<n<<")="<<g<<std::endl; 
    return 0; 
} 

,然後我把子函數到名爲longgcd.cpp

#include <iostream> 
#include <cstdlib> 
long gcd(long m, long n){ 
    long r; 
    while(n !=0){ 
    r=m%n; 
    m=n; 
    n=r; 
    } 
    return m; 
} 

莫名其妙longgcd.cpp不能編譯另一個文件。我得到一個錯誤:

/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: ld returned 1 exit status 
make: *** [longgcd] Error 1 

不知何故,我有困難,運行此程序並利用這個機會,我看不出什麼毛病。感謝您的任何幫助或建議。

+0

你有沒有試過把兩個函數放在同一個文件中並編譯它? – sarsnake

+0

有幾點讓你的代碼更好(除了評論中提到的實際showstoppers):1)在訪問參數之前,你可能要考慮測試'argv'實際上是否至少是'3'。 2)通常在C++中,在初始化的時候聲明變量是一種很好的做法,而不是在函數的開頭。這會使代碼更加緊張,甚至可以提高性能。 – Grizzly

回答

1

你可以顯示你用來編譯的行嗎?這聽起來像你試圖獨立編譯longgcd.cpp作爲一個可執行文件,因爲該文件沒有main,連接器正確地抱怨說,它找不到main

最簡單的辦法是編譯兩個文件一起

g++ $FLAGS longgcd.cpp main.cpp 
+0

其實這不是解決方案。請注意main.cpp中的'#include「longgcd.cpp」'。這可能不是一個好主意,但它的名字'longgcd.cpp'實際上並不需要單獨編譯。 – Grizzly

+0

@Grizzly:我沒注意到。但它聽起來像OP試圖獨立編譯longgcd.cpp。 –

+0

我並不是在辯論那部分答案。我只是想提一下,爲了正確,你的答案要麼提到在編譯器調用中刪除包含或不提及'longgcd.cpp'。 – Grizzly

1

你應該編譯包含main()函數的源文件。

注意#include ING CPP的一般不提倡。你可以把gcd的聲明放在一個頭文件中,並從包含代碼的實現cpp和調用它的主文件中包含這個文件。在這種情況下,您需要指定這兩個 cpp文件到編譯器命令行,因爲它們都需要組裝最終的程序。即使有這種複雜情況,這種方法比包含cpps要好得多。

0

不包括longgcd.cpp。你幾乎不應該包括一個.cpp(除非你真的,真的知道什麼會下降)

你應該指定編譯器的所有cpp。 E.g:g++ main.cpp longgcd.cpp

而且移動long gcd(long m, long n);線上方的主要功能。

1

一個問題是,main應該在你的.cpp文件,而不是你的頭。

另一個原因是,你通常#include一個頭(.h或.HPP)放在.cpp文件,而不是周圍的其他方式。

另外請得到一個體面的C++書籍閱讀。