0

GNU g++ を使用して複数のファイルを一緒にコンパイルしようとしているときに問題が発生しました

次の 5 つのファイルがあるとします。

main.cpp : the main function 
a.h      : the header file of class A 
a.cpp    : the definition of class A 
b.h      : the header file of class B 
b.cpp    : the definition of class B 

プログラムでは、main.cpp はクラス A (したがって ah を含む) を使用し、クラス A はクラス B (したがって bh を含む) を使用します。

したがって、私のメインでは #include "ah" を追加しました

そして、私はそれを使用してコンパイルしようとしています

g++ main.cpp -o main

しかし、これはうまくいきません。「未定義の参照」エラーが表示されます。すべてのクラスをヘッダーファイルと一緒にコンパイルすると、プログラムは必要な出力を提供します

誰かが私がどこで間違っているのか教えてください

4

3 に答える 3

6

すべてのソース ファイルをコンパイルする必要があります。

g++ main.cpp a.cpp b.cpp -o main

段階的に実行したい場合は、それも実行できます。

g++ -c main.cpp -o main.o  # compile
g++ -c a.cpp -o a.o        # compile
g++ -c b.cpp -o b.o        # compile
g++ -o main main.o a.o b.o # link

しかし、あなたがすべきことは、適切なメイクファイルを使用することです:

CXXFLAGS = -MMD
OBJECTS = main.o a.o b.o
MAKEDEPS = $(OBJECTS:.o=.d)

main: $(OBJECTS)
    $(CXX) $(CXXFLAGS) -o $@ $^

clean:
    rm -f *.d *.o main

.PHONY: clean

-include $(MAKEDEPS)

例:

$ make
c++ -MMD   -c -o main.o main.cpp
c++ -MMD   -c -o a.o a.cpp
c++ -MMD   -c -o b.o b.cpp
c++ -MMD -o main main.o a.o b.o
于 2013-10-19T04:25:36.670 に答える
2

のみをビルドするmain.cppと、呼び出したオブジェクトと関数の宣言が見つかるため、コンパイラは文句を言いません。リンカーの仕事は、定義を見つけられるようにすることです。

a.cppb.cpp一緒にコンパイルしてリンクするように要求しなかったmain.cppため、「未定義の参照先」エラーが発生します。

リンカは基本的に、次のように伝えています。

編集:あなたのコメントを見た後、私はあなたの問題を理解することができます. 宣言定義には違いがあります。

コンパイラは、使用されているクラス、関数、型、および変数の宣言を見つけることに依存しています。ヘッダー ファイルを含めなかった場合 (試してみてください!)、コンパイラからのUndeclared identifier エラーが発生します。

リンカーは、使用する関数と変数の定義を見つけることに依存しています。実装/定義を含む必要なファイルをリンクしなかった場合は、リンカーからのUndefined reference to ...エラーが発生します。

于 2013-10-19T04:27:45.723 に答える
0

http://linux.die.net/man/1/g++を読んでください

-c でコンパイルしてから、それらのオブジェクトをリンクする必要があります

于 2013-10-19T04:27:28.810 に答える