3

私はEdwardSchneinermanの数学者向けC++からC++を学んでいます。私は第2章の最大公約数のセクションに取り組んでいます。3つのファイルを作成しました。

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++を初めて使用し、コンパイルとリンクを完全に理解していません。私は何が間違っているのですか?

4

3 に答える 3

5

両方のCファイルをコンパイルしてみてください。

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

それ以外の場合は、(ヘッダーファイルで)'gcd'が宣言されていますが、コンパイラーにはその実装がありません。

于 2013-03-04T15:23:55.023 に答える
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
于 2013-03-04T15:24:32.540 に答える
0

最初にgcd.ccをコンパイルする必要があります。

$g++ -c gcd.cc -o gcd.o
$g++ gcdtest.cc gcd.o -o gcdtest.exe
于 2013-03-04T15:24:13.833 に答える