Ошибка связывания C++ после обновления до Mac OS X 10.9 / Xcode 5.0.1
После обновления до 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
2 ответа
Ответ здесь: 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++ к команде компоновки.
Связанный пост: Компиляция с Clang с использованием неопределенных ссылок LibC++
Изменить: После некоторых исследований, кажется, есть связь между -mmacosx-version-min
и выбор по умолчанию libstd
, Если минимальная версия < 10,9, то по умолчанию libstd
равно libstdc++
иначе libc++
, Долгосрочное решение явно использовать -stdlib=libc++
Эти предложения не сработали для меня с Mac El capitan. Если после обновления до El Capitan возникают похожие проблемы, просто запустите
xcode-select --install
прежде чем пытаться скомпилировать