web-dev-qa-db-fra.com

Erreur de liaison C ++ après la mise à niveau vers Mac OS X 10.9 / Xcode 5.0.1

Après la mise à niveau vers Mac OS X 10.9/Xcode 5.0.1, les lignes de commande pour créer une bibliothèque partagée (.dylib) ont échoué avec plusieurs symboles non définis.

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
26
FabienRohrer

La réponse est là: https://mathematica.stackexchange.com/questions/34692/mathlink-linking-error-after-os-x-10-9-mavericks-upgrade

Il existe deux implémentations de la bibliothèque C++ standard disponibles sur OS X: libstdc ++ et libc ++. Ils ne sont pas compatibles binaires et libMLi3 nécessite libstdc ++.

Sur 10.8 et versions antérieures, libstdc ++ est choisi par défaut, sur 10.9 libc ++ est choisi par défaut. Pour garantir la compatibilité avec libMLi3, nous devons choisir manuellement libstdc ++.

Pour ce faire, ajoutez -stdlib = libstdc ++ à la commande de liaison.

Article connexe: Compilation avec Clang en utilisant des références non définies Libc ++


Edit : Après quelques investigations, il semble qu'il y ait un lien entre le -mmacosx-version-min et le choix de la valeur par défaut libstd. Si la version min <10.9, la valeur par défaut libstd est égale à libstdc++, sinon à libc++. La solution à long terme est clairement d'utiliser -stdlib=libc++

36
FabienRohrer

Ces suggestions n'ont pas fonctionné pour moi avec Mac El capitan. Si vous rencontrez des problèmes similaires après la mise à niveau vers El Capitan, exécutez simplement

xcode-select --install

avant d'essayer de compiler

0
Omer Cansizoglu