0

コンパイルできるコードがいくつかありますが、リンクしません。これがなぜなのかはわかりません。この問題は通常、リンクされているものを修正することで解決されることはわかっていますが、なぜこれが壊れているのかわかりません。TransGame は Game を拡張したクラスで、SearchGame は TransGame を拡張したクラスです。

これが私が得ているエラーです:

mrdmnd@dr-wily:~/ConnectFour$ make all                                                                                                                                                                             
g++    -c -o SearchGame.o SearchGame.cc
g++    -c -o TransGame.o TransGame.cc
g++    -c -o Game.o Game.cc
g++ SearchGame.o TransGame.o Game.o -o SearchGame
TransGame.o: In function `TransGame::hash()':
TransGame.cc:(.text+0x5f): undefined reference to `Game::positioncode()'
collect2: ld returned 1 exit status
make: *** [SearchGame] Error 1

これが私のメイクファイルです:

CFLAGS = -c -Wall
SOURCES = SearchGame.cc TransGame.cc Game.cc
OBJECTS = $(SOURCES:.cc=.o)
EXECUTABLE = SearchGame
.PHONY : all clean

all : $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CXX) $(OBJECTS) -o $@

*.o :
    $(CXX) $(CFLAGS) $< -o $@

clean:
    rm -rf *.o

関連するコードは次のとおりです。

TransGame.cc

#include "Game.h"
#include "TransGame.h"
// snip
void TransGame::hash() {
  long htemp = positioncode();
  //snip
}

TransGame.h

#ifndef TRANSGAME_H
#define TRANSGAME_H
//snip
class TransGame : public Game {
  public:
    //snip
    void hash();
    //snip
};

#endif

ゲーム.cc

#include "Game.h"
// snip
inline long Game::positioncode() {
  return color[nplies & 1] + color[0] + color[1] + BOTTOM;
}

ゲーム.h

#ifndef GAME_H
#define GAME_H
//snip
class Game {
  public:
    //snip
    long positioncode();
    //snip
};

#endif

どんな助けでも大歓迎です - 私のメイクファイルに明らかなものが欠けていると確信しています。

4

1 に答える 1

1

コンパイラは呼び出しをコードGame::positioncode()に置き換えるためにその定義を知る必要があるため、関数はインライン関数であり、ヘッダーに含める必要があります。positioncode

2つの方法があります。の定義の下に関数を追加するかclass Game、宣言に直接追加することができます。

class Game {
  public:
    long positioncode()
    {
      return color[nplies & 1] + color[0] + color[1] + BOTTOM;
    }
};
于 2012-10-10T06:39:00.313 に答える