-2

Mac で C++ コードをコンパイルしようとしています。Xcode を使用して実行できますが、gcc を使用して端末からコンパイルしようとすると、次のエラーが発生します。

Undefined symbols for architecture x86_64:
  "std::cout", referenced from:
      _main in ccOJDOlb.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      _main in ccOJDOlb.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccOJDOlb.o
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in ccOJDOlb.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

何が起こっているのか知っている人はいますか?

4

2 に答える 2

1

ld: アーキテクチャ x86_64 のシンボルが見つかりません

これは、リンカーである「ld」が、プログラムで使用する一部のシンボルの定義を見つけることができないことを示しています。これで、コンパイルが成功したことがわかります。

そして ld は特定のシンボルをリストします。それらはすべて標準ライブラリからのものであることに注意してください。これは、標準ライブラリがおそらくリンカによって検出されていないことを示しているはずです。

通常、ライブラリを使用する場合、リンク フラグを使用してコンパイラ ツールチェーンに通知する必要があります。しかし、言語の標準ライブラリの場合、GNU コンパイラ コレクションのコンパイラは、通常、その言語のライブラリが必要であると想定しています。したがって、gcc コマンドを実行すると C 標準ライブラリが自動的に含まれ、g++ を実行すると C++ 標準ライブラリが自動的に含まれます。ただし、「gcc」を実行しても C++ 標準ライブラリに自動的にリンクされないことに注意してください。コマンド 'gcc' を実行していて、C++ 標準ライブラリの正しいリンカー フラグを追加していない可能性が非常に高いです。

何らかの理由で g++ ではなく gcc を使用する場合は、標準ライブラリが必要であることを明示的に指定する必要があります-lstdc++


また、本当に gcc が必要で、その最新バージョンを OS X に自分でインストールする場合を除き、clang/clang++ および C++ 標準ライブラリの libc++ 実装に切り替えることをお勧めします。Xcode に付属する gcc は古いバージョンに基づいており、標準ライブラリも同様に古いものです。Xcode は、しばらく前からシステム コンパイラとして clang に移行しています。clang コンパイラ ドライバには gcc との基本的な互換性があるため、同じ基本フラグの多くを使用できます。始めるのに適したセットは次のとおりです。

clang++ -std=c++11 -stdlib=libc++ -Wall -Wextra
于 2013-02-12T21:20:59.967 に答える
1

gccを使用して端末からコンパイルしようとしています

次にg++、プレーンオールの代わりに試してくださいgcc。前者は C++ 標準ライブラリに自動的にリンクしますが、後者はリンクしません。

于 2013-02-12T20:58:18.920 に答える