Zumindest für die Crypto++-Bibliothek funktioniert dies nicht (verifiziert :-( ). Für C++-Code ist es also weniger wahrscheinlich, dass es funktioniert, während reiner C-Code wahrscheinlich OK verlinken würde.
BEARBEITEN:Das Problem trat erstmals mit Mac OS X 10.9 Mavericks und Xcode-5 auf, wodurch die standardmäßige C++-Bibliothek für Clang von libstdc++ auf libc++ umgestellt wurde. Es existierte nicht unter Mac OS X 10.8 und früher.
Die Lösung scheint zu sein:Wenn Sie C++-Code mit clang kompilieren und mit einer gcc-kompilierten Bibliothek verknüpfen müssen, verwenden Sie "clang++ -stdlib=libstdc++". Die Verknüpfung ist erfolgreich und die resultierende Binärdatei wird korrekt ausgeführt.
VORBEHALT:Es scheint nicht anders zu funktionieren:Obwohl Sie eine mit "clang++ -stdlib=libstdc++" kompilierte Bibliothek erstellen und gcc-kompilierten Code damit verknüpfen können, stürzt dieser Code mit SEGV ab. Bisher habe ich festgestellt, dass die einzige Möglichkeit, mit einer Clang-kompilierten Bibliothek zu verknüpfen, darin besteht, Ihren Code mit Clang zu kompilieren, nicht mit gcc.
BEARBEITEN2 :GCC-12 scheint -stdlib=
zu enthalten Flagge. Kompilieren mit g++ -stdlib=libc++
erstellt Clang++
-kompatible Objektdateien. Sehr schön.
Ja, Sie normalerweise kann clang
verwenden mit GCC-kompilierten Bibliotheken (und umgekehrt, verwenden Sie gcc
mit CLANG-kompilierten Bibliotheken), da es tatsächlich nicht auf die Kompilierung, sondern auf das Linken ankommt. Sie könnten Pech haben und unangenehme Überraschungen erleben.
Sie könnten im Prinzip einige Abhängigkeiten von der Version von libstdc++
haben verwendet, um die relevanten Bibliotheken zu verknüpfen (wenn sie in C++ codiert sind). Eigentlich spielt das normalerweise keine Rolle.
In C++ könnte Namensverstümmelung theoretisch ein Problem sein (es könnte einige Sonderfälle geben, sogar Inkompatibilitäten zwischen zwei verschiedenen Versionen von g++
). Auch hier ist dies in der Praxis normalerweise kein Problem.
Normalerweise können Sie CLANG (sogar verschiedene, aber ähnliche Versionen davon) mit GCC mischen, aber Sie können unangenehme Überraschungen erleben. Was von jedem C++-Compiler (sei es CLANG oder GCC) erwartet werden sollte, ist einfach, eine ganze Software (und alle Bibliotheken) zusammen mit demselben Compiler und derselben Version kompilieren und verknüpfen zu können (und das beinhaltet dieselbe Implementierung der C++-Standardbibliothek ). Aus diesem Grund ist das Aktualisieren eines Compilers in einer Distribution eine Menge Arbeit:Die Distributionshersteller müssen sicherstellen, dass alle Pakete gut kompiliert werden (und sie erleben Überraschungen!).
Beachten Sie, dass die Version von libstdc++ eine Rolle spielt. Sowohl die Clang- als auch die GCC-Community arbeiten hart daran, ihre ABI für Compiler-Upgrades kompatibel zu machen, aber es gibt subtile Eckfälle. Lesen Sie die Dokumentation Ihrer speziellen und spezifischen Implementierung der C++-Standardbibliothek. Diese Eckfälle könnten mysteriöse Abstürze erklären, wenn Sie eine gute C++-Bibliotheks-Binärdatei (kompiliert mit GCC 5) in Ihrem mit GCC 8 kompilierten Code verwenden. Der Fehler liegt nicht in der Bibliothek, sondern die ABI hat sich inkompatibel entwickelt.