2013-03-04 2 views
3

Я изучаю 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++ и Havent полностью grokked компиляции и компоновки. Что я делаю не так?

+1

Вы не компилируется файл gcd.cc, поэтому связь не удается при поиске НОД function – SomeWittyUsername

+0

Кроме того, у вас есть опечатка в 'gcd.cc'. 'retrun! = return' – MikeTheLiar

ответ

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, и это не удастся из-за отсутствия основного. –

+0

Спасибо, Шарт, ты был прав. –

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 
Смежные вопросы