Błąd połączenia C++ po aktualizacji do Mac OS X 10.9 / Xcode 5.0.1

Po aktualizacji do Mac OS X 10.9 / Xcode 5.0.1, linie poleceń do utworzenia biblioteki współdzielonej (.dylib) z kilkoma nieokreślonymi symbolami.

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
Author: FabienRohrer, 2013-10-28

2 answers

Odpowiedź jest tam: https://mathematica.stackexchange.com/questions/34692/mathlink-linking-error-after-os-x-10-9-mavericks-upgrade

Istnieją dwie implementacje standardowej biblioteki C++ dostępne na OS X: libstdc++ i libc++. Nie są kompatybilne binarnie i libMLi3 wymaga libstdc++.

W wersjach 10.8 i wcześniejszych libstdc++ jest domyślnie wybierane, w wersji 10.9 libc++ jest domyślnie wybierane. Aby zapewnić kompatybilność z libMLi3, musimy wybrać libstdc++ ręcznie.

Aby to zrobić, dodaj -stdlib = libstdc++ do polecenia łączącego.

Related post: Kompilowanie z Clang przy użyciu libc++ undefined references


Edit : po niektórych dochodzeniach wydaje się, że istnieje związek między -mmacosx-version-min a wyborem domyślnego libstd. Jeśli min Wersja libstd jest równa libstdc++, w przeciwnym wypadku libc++. Rozwiązanie długoterminowe jest wyraźnie do użycia -stdlib=libc++

 35
Author: FabienRohrer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:13

Te sugestie nie zadziałały dla mnie z Mac El capitan. Jeśli masz podobne problemy po aktualizacji do El Capitan, po prostu uruchom

xcode-select --install

Przed próbą kompilacji

 1
Author: Omer Cansizoglu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-03 06:19:18