1

Triliza.h、Triliza.cpp、Game.cppの3つのファイルがあります。これは私のmakefileです

CC = g++
prog: Game.o
    $(CC) Game.o -Wall -Werror -pedantic -o Triliza
Game.o: Game.cpp Triliza.h
    $(CC) -Wall -Werror -pedantic -c Game.cpp
Triliza.o: Triliza.cpp Triliza.h
    $(CC) -Wall -Werror -pedantic -c Triliza.cpp

これは私のメインファイルです:Game.cpp

#include <iostream>
using namespace std;
#include "Triliza.h"

Triliza *triliza;

int main(int argc, char* argv[])
{
while (1)
{
    triliza = new Triliza();
    triliza->verifyFirstPlayer();
    triliza->loop();

    if (!triliza->playAgain())
        break;
}

return 0;
}

エラー出力があります:

g++ Game.o -Wall -Werror -pedantic -o Triliza
Undefined symbols:
"Triliza::Triliza()", referenced from:
  _main in Game.o
"Triliza::verifyFirstPlayer()", referenced from:
  _main in Game.o
"Triliza::loop()", referenced from:
  _main in Game.o
"Triliza::playAgain()", referenced from:
  _main in Game.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [prog] Error 1

したがって、各ファイルを一緒にインポートしようとすると、何か問題があると思います。誰かが私に正しい方法を教えてもらえますか?ありがとう

編集:変更後、別のエラーが発生しました。

make: *** No rule to make target `Trizilla.o', needed by `prog'.  Stop.

すべての返信をありがとう。わかった。Trilizaにスペルミスがあるため

4

3 に答える 3

3

実際、makeファイルはこれと同じくらい単純である可能性があります(それぞれ2行のみ)。

CXXFLAGS:=-Wall -Werror -pedantic
prog: Game.cpp Triliza.cpp

おそらく代わりにこれが必要でしたが:

CXXFLAGS:=-Wall -Werror -pedantic
Triliza: Game.cpp Triliza.cpp

ただし、どちらの場合も、(変更された)ヘッダーファイルは明示的に考慮されません。

CXX.cppGNUmakeの組み込みルールを使用してファイルをコンパイルするために自動的に実行されます。組み込みのルールとターゲットを確認するには、次の手順を実行します。

make -np -f /dev/null

-f編集前に小文字はここで大文字になりました)


ここで、ヘッダーファイルの依存関係も関連していると仮定しましょう。この場合、2番目の例を調整して、次の(完全な)makeファイルを作成します。

CXXFLAGS:=-Wall -Werror -pedantic
Triliza: Game.cpp Triliza.cpp
dependencies: Game.cpp Triliza.cpp
    $(CXX) -M $(CXXFLAGS) $^ > $@

include dependencies

明らかに、$(CXX)理解している場合にのみ機能します。-MGCCは(として呼び出されたか、として呼び出されたかに関係なくgcc)行いg++ます。

于 2012-05-25T12:50:15.323 に答える
2

依存関係の問題により、実行可能ファイルがビルドされるときにTriliza.oにリンクしていません。次のようにprogターゲットを変更します。

prog: Game.o Triliza.o
    $(CC) Game.o Triliza.o -Wall -Werror -pedantic -o Triliza
于 2012-05-25T12:49:58.780 に答える
0

問題は、progに依存しないことTriliza.oです。どちらもしませんGame.o

prog: Game.o Triliza.o
    $(CC) -Wall -Werror -pedantic -o Triliza $^

これでうまくいくはずです。 $^依存関係をスペース区切りのリストにepxandします。

于 2012-05-25T12:50:13.483 に答える