2012-09-06 134 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++书籍阅读。