web-dev-qa-db-ja.com

Mac OS X 10.9 / Xcode 5.0.1へのアップグレード後のC ++リンクエラー

Mac OS X 10.9/Xcode 5.0.1にアップグレードした後、共有ライブラリ(.dylib)を作成するコマンドラインがいくつかの未定義のシンボルで失敗しました。

clang++ -dynamiclib -install_name test.dylib *.o -o test.dylib
Undefined symbols for architecture x86_64:
  "std::allocator<char>::allocator()", referenced from:
      _main in test.o
  "std::allocator<char>::~allocator()", referenced from:
      _main in test.o
  "std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from:
      _main in test.o
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
      _main in test.o
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
      _main in test.o
  "std::ios_base::Init::Init()", referenced from:
      ___cxx_global_var_init in test.o
  "std::ios_base::Init::~Init()", referenced from:
      ___cxx_global_var_init in test.o
  "std::cout", referenced from:
      _main in test.o
  "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
      _main in test.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 test.o
ld: symbol(s) not found for architecture x86_64
26
FabienRohrer

答えはそこにあります: https://mathematica.stackexchange.com/questions/34692/mathlink-linking-error-after-os-x-10-9-mavericks-upgrade

OS Xで利用可能な標準C++ライブラリには、libstdc ++とlibc ++の2つの実装があります。これらはバイナリ互換ではなく、libMLi3にはlibstdc ++が必要です。

10.8以前ではlibstdc ++がデフォルトで選択され、10.9ではlibc ++がデフォルトで選択されています。 libMLi3との互換性を確保するには、libstdc ++を手動で選択する必要があります。

これを行うには、リンクコマンドに-stdlib = libstdc ++を追加します。

関連記事: Libc ++未定義参照を使用したClangでのコンパイル


Edit:いくつかの調査の後、-mmacosx-version-minとデフォルトのlibstdの選択との間にリンクがあるようです。最小バージョン<10.9の場合、デフォルトのlibstdlibstdc++に等しく、そうでない場合はlibc++に等しくなります。長期的な解決策は、明らかに-stdlib=libc++を使用することです

36
FabienRohrer

Mac El capitanではこれらの提案はうまくいきませんでした。 El Capitanにアップグレードした後に同様の問題がある場合は、単に実行してください

xcode-select --install

コンパイルする前に

0
Omer Cansizoglu