Подтвердить что ты не робот

Ошибка связи С++ после обновления до Mac OS X 10.9/Xcode 5.0.1

После обновления до Mac OS X 10.9/Xcode 5.0.1 командные строки для создания общей библиотеки (.dylib) завершились с несколькими символами undefined.

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
4b9b3361

Ответ 1

Ответ: https://mathematica.stackexchange.com/questions/34692/mathlink-linking-error-after-os-x-10-9-mavericks-upgrade

В OS X реализованы две версии стандартной библиотеки С++: libstdС++ и libС++. Они не совместимы с двоичными файлами, а libMLi3 требует libstdС++.

В 10.8 и более ранних версиях libstdС++ по умолчанию выбран 10.9 libС++. Чтобы обеспечить совместимость с libMLi3, нам нужно выбрать libstdС++ вручную.

Чтобы сделать это, добавьте -stdlib = libstdС++ к команде связывания.

Связанное сообщение: Компиляция с помощью Clang с использованием ссылок LibС++ undefined


Изменить. После некоторых исследований кажется, что существует связь между -mmacosx-version-min и выбором по умолчанию libstd. Если минимальная версия < 10.9, то значение по умолчанию libstd равно libstdc++, иначе - libc++. Долгосрочное решение, очевидно, должно использовать -stdlib=libc++

Ответ 2

Эти предложения не сработали для меня с Mac El capitan. Если у вас возникли подобные проблемы после обновления до El Capitan, просто запустите

xcode-select --install

прежде чем пытаться скомпилировать