Ich möchte Boost für Mac OS X 10.9 mit stdlibc ++ kompilieren. Ich führe den folgenden Befehl aus:
%Vor%Der Build wird erfolgreich abgeschlossen. Jedoch schlägt mein Anwendungsaufbau zur Verknüpfungszeit fehl, wenn es keine Symbole finden kann, die wie std :: __ 1 :: locale :: use_facet, std :: __ 1 :: basic_string usw. zu finden sind. Das relevante Detail dort ist das __1, glaube ich.
Meine Frage ist, wie kompiliere ich Boost für OSX 64b Plattformen mit stdlibc ++?
Weitere Informationen:
Ich habe die folgenden Protokolle während der Kompilierung bemerkt:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: Datei: bin.v2 / libs / filesystem / build / clang-darwin-4.2.1 / release / link- static / runtime-link-statisch / threading-multi / libboost_filesystem.a (windows_file_codecvt.o) hat keine Symbole
Downloaded Boost 1.55, bootstrapped mit:
%Vor%Errichtet mit:
%Vor% Erträge in libboost_chrono.a
:
Dies bedeutet, dass die Bibliothek mit der Option -stdlib=libstdc++
erstellt wurde - d. h. sie ist mit der Gnu-Version der C ++ - Laufzeit verknüpft.
Wir löschen den Build mit:
%Vor%Wenn wir das nicht tun, wird es nicht wiederhergestellt, und Sie haben den gleichen Code wie zuvor. Als nächstes bauen wir mit:
%Vor% Erträge in libboost_chrono.a
:
Was bedeutet, dass es gegen libc++
erstellt wurde.
Dies kann verifiziert werden, indem ein einfaches Test-C ++ - Programm verwendet wird (um die Verknüpfung anzuzeigen):
%Vor% Ja, es wird mit der entsprechenden Flagge kompiliert. Was es bedeutet, dass Sie das -stdlib=libstdc++
an alles weitergeben müssen, das Sie kompilieren, wenn Sie XCode 5 verwenden, da es jetzt standardmäßig -stdlib=libc++
verwendet. Dies bedeutet, dass beliebige C ++ - basierte Bibliotheken, die von c++
stdlib abhängig sind, von denen Sie abhängig sind, ebenfalls mit demselben Flag kompiliert werden müssen.
Seien Sie vorsichtig mit einem inkrementellen Build von Boost - wenn Sie die Dateien .o
und .a
nicht löschen, werden sie nicht basierend auf den geänderten Flags neu kompiliert Dateien als kompiliert, also wenn sie falsch kompiliert wurden, dann tritt das Problem auf.