6

XCode で学校のプロジェクトを開発しています。最終製品はメイクファイルを含むソース コードで提出する必要があるため、作業コピーがあることを確認するために、メイクファイルを作成し、その方法でコンパイルを開始しました。これが私のメイクファイルです:

all: main.o StackList.o world.o Farm.o
        gcc main.o StackList.o world.o Farm.o -g -o Project1

main.o:
        gcc -g -c main.cpp

StackList.o:
        gcc -g -c Stacklist.cpp

world.cpp:
        gcc -g -c world.cpp

Farm.cpp:
        gcc -g -c Farm.cpp

clean:
        rm *.o Project1

各オブジェクト ファイルのコンパイルは正常に機能しますが、「すべて」のリンク手順になると、標準ライブラリを認識していないように見えます。「cin」から「basic_string」、「operator new」までのすべてで「未定義のシンボル」エラーが発生します。

これらのことは直接示す必要はないと思っていましたし、実際に過去にそうする必要はありませんでした。

何が起こっているのでしょうか?

編集:

それが役立つ場合、これが(非常に長い)エラーメッセージの始まりです:

Undefined symbols for architecture x86_64:
  "std::cin", referenced from:
  _main in main.o
  "std::cout", referenced from:
      _main in main.o
      Farm::print(int)  in Farm.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
      _main in main.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int)in main.o
      __static_initialization_and_destruction_0(int, int)in StackList.o
      __static_initialization_and_destruction_0(int, int)in world.o
      __static_initialization_and_destruction_0(int, int)in Farm.o
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in main.o
      ___tcf_0 in StackList.o
      ___tcf_0 in world.o
      ___tcf_0 in Farm.o
  "operator new(unsigned long)", referenced from:
      doStackSearch(std::basic_istream<char, std::char_traits<char> >*, std::list<Farm*, std::allocator<Farm*> >*&)in world.o
4

4 に答える 4

23

g++C++ コードをリンクするには、コマンドではなくコマンドを使用する必要がありますgcc

コンパイル時に、このコマンドはサフィックスgccによって C++ コードをコンパイルしていることを認識します (ただし、とにかくコマンドを使用することをお勧めします)。.cppg++

リンクするとき、gccコマンドはたくさんの.oファイルを見るだけです。このコマンドは、C++ 固有のライブラリを見つける場所を認識しているというg++点で、コマンドとは異なります。gcc

(名前gccが、通常は C コードをコンパイルするために使用されるコマンドと、「GNU Compiler Collection」全体の両方を指すという事実は、少し混乱する可能性があります。)

于 2012-01-18T03:18:15.440 に答える
2

g++ではなく、C++ ソース コードをコンパイルおよびリンクするために を使用する必要がありますgcc

また、最初と最後のターゲット以外のすべてのターゲットを除外することもできます。ファイルmakeをコンパイルする方法は既に知っています。その方法を指定する必要はありません。.cpp.o

于 2012-01-18T03:18:25.963 に答える
-2
    gcc main.o StackList.o world.o Farm.o -g -o Project1

gccこのコマンド ラインで、C++ 標準ライブラリにリンクするように指示しているのは何だと思いますか? リンクされている C++ ファイルはありません。言語が指定されていません。そして、コンパイラを として呼び出しますgcc

于 2012-01-18T03:21:35.160 に答える