升级到Mac OS X 10.9/Xcode 5.0.1后,C++链接错误

Fab*_*rer 26 c++ linker clang++ osx-mavericks

升级到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
Run Code Online (Sandbox Code Playgroud)

Fab*_*rer 36

答案是:https://mathematica.stackexchange.com/questions/34692/mathlink-linking-error-after-os-x-10-9-mavericks-upgrade

OS X上有两种标准C++库实现:libstdc ++和libc ++.它们不是二进制兼容的,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++