Ich habe Probleme mit der Verbindungsphase in meinem C ++ - Programm aufgrund von Problemen mit Boost 1.49. Ich habe zu C ++ gewechselt ( -std=c++11 -libc=libc++
), das funktioniert gut für einen anderen Code (der auch boost verwendet). Boost wurde mit Homebrew installiert mit:
Das Problem beginnt mit boost::program_options
. Ich bekomme die Linkfehler wie folgt:
Das ist etwas merkwürdig, weil ein nm auf der verwendeten Bibliothek zeigt, dass das Symbol dort zu sein scheint:
%Vor%Ich habe bereits versucht, Homebrew zu überreden, Boost mit clang statt gcc zu kompilieren, indem ich CXX und CXX_FLAGS vor der Installation entsprechend einstelle. Nicht sicher, ob es mir gelungen ist.
Zeiger sehr geschätzt.
Sie müssen Boost mit clang und std11 Flags neu kompilieren, die libc ++ Bibliothek ist nicht binärkompatibel mit dem installierten libstdc ++ in OSX (sehr frühe Version von gcc vor dem Wechsel zu gpl3). Wenn Ihre Version von clang 3.1 oder älter ist, können Sie sie verwenden (ändern Sie andernfalls c ++ 11 in C ++ 0x für frühere Versionen).
%Vor%Sie können natürlich beliebige davon ändern, außer
toolset = clang cxxflags="- std = c ++ 0x -stdlib = libc ++"
Dies sollte für Sie funktionieren.
Ich möchte meine (mäßig schmerzhafte) Erfahrung mit Boost 1.54 unter Mac OS X 10.8.5 mit clang 5.0.0 teilen, wie es Xcode 5.0 liefert. Wenn Sie die C ++ 11 Funktionen haben möchten, ist es sehr wichtig, dass Sie mit clang++
kompilieren und verknüpfen, nicht mit clang
.
Abbildung: Nehmen Sie das folgende einfache Programm:
%Vor%Kann mit dem folgenden Befehl erstellt werden:
clang++ -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr
jedoch, wenn Sie dies stattdessen versuchen:
clang -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr
Dann erhalten Sie Linker-Fehler. Beachten Sie, dass die Hilfeseite clang
angibt, dass die Sprache mit der Option -std=
ausgewählt wurde, aber das ist eindeutig nicht genug.
Die Lektion ist, dass wir bjam
mitteilen müssen, dass clang++
explizit verwendet wird, wenn Boost mit C ++ 11-Unterstützung kompiliert wird.
Nach dieser sehr nützliche Beitrag , Füge ich folgendes in mein tools/build/v2/user-config.jam
:
Dann habe ich ./b2 clean
ausgeführt, dann habe ich Boost mit dem folgenden Befehl erstellt:
Dies erstellt die 64-Bit-statischen und dynamischen Bibliotheken mit Multithreading-Unterstützung. Wenn Sie einen anderen Satz benötigen, ändern Sie den obigen Befehl entsprechend.