2013-03-04 30 views
3

我正在从Edward Schneinerman的C++学习C++的数学家。我工作的最大公约数部分第2章中我取得了三个文件:编译一个C++程序头文件(新手)

gcd.h

#ifndef GCD_H 
#define GCD_H 

long gcd(long a, long b); 

#endif 

gcd.cc

#include "gcd.h" 
#include<iostream> 

using namespace std; 

long gcd(long a, long b) { 
    if(a == 0 && b == 0) { 
     cerr << "WARNING: gcd(0,0) not defined" << endl; 
     return 0; 
    } 

    if(a < 0) a = -a; 
    if(b < 0) b = -b; 

    if(b == 0) retrun a; 
    if(a == 0) return b; 

    long c = a % b; 

    return gcd(b,c); 
} 

和gcdtest.cc

#include "gcd.h" 
#include <iostream> 

using namespace std; 

int main() { 
    long a,b; 

    cout << "Enter the first number > "; 
    cin >> a; 
    cout << "Enter the second number > "; 
    cin >> b; 

    long d = gcd(a,b); 

    cout << "The gcd of " << a << " and " << b << " is " << d << endl; 

    return 0; 
} 

所有这些文件驻留在相同的目录中。当我尝试编译gcdtest.cc

$ g++ -Wall gcdtest.cc -o gcdtest.exe 

我收到以下错误:

$ g++ -Wall gcdtest.cc -o gcdtest.exe 
Undefined symbols for architecture x86_64: 
     "gcd(long, long)", referenced from: 
      _main in ccgbCyQO.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

我全新的C++和还没有完全grokked编译和链接。我究竟做错了什么?

+1

您还没有编译你的gcd.cc文件,因此联动寻找最大公约数时失败函数 – SomeWittyUsername 2013-03-04 15:24:19

+0

另外,你在'gcd.cc'中有一个输入错误。 'retrun!= return' – MikeTheLiar 2013-03-04 15:42:29

回答

5

你应该尝试编译两个C文件:

$ g++ -Wall gcdtest.cc gcd.cc -o gcdtest.exe 

否则你有“最大公约数”声明(在头文件),但是编译器丢失其实施。

0

您必须先编译gcd.cc。

$g++ -c gcd.cc -o gcd.o 
$g++ gcdtest.cc gcd.o -o gcdtest.exe 
+1

你的第一条线是不正确的。这将尝试创建一个名为gcd.o的二进制文件,并且会因缺少主文件而失败。 – 2013-03-04 15:25:18

+0

谢谢谢尔斯,你说得对。 – 2013-03-04 15:42:06

2

编译程序或者是这样的:

g++ -Wall gcd.cc gcdtest.cc -o gcdtest.exe 

或者这样说:

g++ -Wall -c gcdtest.cc 
g++ -Wall -c gcd.cc 
g++ -Wall gcd.o gcdtest.o -o gcdtest.exe