26

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
4

2 に答える 2

36

答えはそこにあります: 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 でコンパイルする


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

于 2013-10-28T14:18:15.970 に答える
0

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

xcode-select --install

コンパイルを試みる前に

于 2016-06-03T06:19:18.133 に答える