Ist clang++ ABI dasselbe wie g++? [duplicate]

Lesezeit: 3 Minuten

Ist clang ABI dasselbe wie g duplicate
Emanuele

Mögliches Duplikat:

GCC 4.0, 4.2 und LLVM ABI-Kompatibilität

Sind beide C++ ABIs pro Thema kompatibel?
Dh kann eine mit ersterem generierte Binärdatei (Shared Object) verwendet und mit letzterem verknüpft werden (und umgekehrt)?

Beifall

  • Die sehr allgemeine Antwort hier wird nein sein. Aber ich denke, es wird davon abhängen, was genau Sie kompilieren und für welche Architektur.

    – Falmarri

    27. Juli ’12 bei 6:54

  • Ich denke, meine Frage ist nicht einfach bezogen auf die libstdc++-Kompatibilität, aber sogar dein eigenes C++ gemeinsame Objekte.

    – Emanuele

    27. Juli ’12 um 9:47

  • Jetzt mehr: llvm.org/bugs/show_bug.cgi?id=23529 . gcc 5.1 hat ein neues abi eingeführt, das von clang noch nicht implementiert ist

    – ibre5041

    31. Juli ’16 um 20:53

Laut der clang libc++-Seite, sie zielen auf

ABI-Kompatibilität mit gccs libstdc++ für einige Low-Level-Funktionen wie Ausnahmeobjekte, rtti und Speicherzuweisung.

was zu implizieren scheint, dass sie nicht auf eine 100%ige Kompatibilität abzielen. Auf dieser Seite heißt es zum Beispiel auch:

Aus jahrelanger Erfahrung (einschließlich der vorherigen Implementierung der Standardbibliothek) haben wir viel über die Implementierung von Standardcontainern gelernt, die ABI-Bruch und grundlegende Änderungen ihrer Implementierung erfordern. Es ist beispielsweise allgemein anerkannt, dass das Erstellen von std::string mit der “Short-String-Optimierung” anstelle von Copy On Write (COW) ein besserer Ansatz für Multicore-Rechner ist (insbesondere in C++’0x, das rvalue-Referenzen hat). Es wurde festgestellt, dass das Aufbrechen der ABI-Kompatibilität mit alten Versionen der Bibliothek entscheidend ist, um die Leistungsziele von libc++ zu erreichen.

Ich glaube, dass GCC immer noch eine COW mit Referenzzählung verwendet, also scheint sich Clang keine Sorgen um die ABI-Kompatibilität mit zu machen std::string (entweder mit älteren clang-kompilierten Binärdateien oder mit GCC).

  • Das gleiche mit VC++. “In jeder Hauptversion (VS 2005, 2008, 2010, 2012 usw.) ändern wir die Darstellungen von STL-Objekten wie String und Vektor, wodurch sie binär-inkompatibel werden. Wir haben jetzt Linker-Prüfungen, die verhindern, dass Objektdateien/statische Bibliotheken kompiliert gemischt werden mit verschiedenen Hauptversionen (2010+)…” (siehe social.msdn.microsoft.com/forums/en-us/vcgeneral/thread/…)

    – SCHepurin

    27. Juli ’12 um 8:22


  • Ich vermute stattdessen die C ABI ist 100 % kompatibel, oder?

    – Emanuele

    27. Juli ’12 um 9:44

  • libc++ ist nicht dasselbe wie Clang, denke ich. Warum konzentriert sich die Antwort auf die Kompatibilität mit Standardbibliotheken und nicht auf die Kompatibilität von Sprachbinärdateien? Ist es offensichtlich, dass sie dieselben Aufrufkonventionen für Methoden verwenden, Objekte auf dem Stack zurückgeben und im Allgemeinen auf Sprachebene binärkompatibel sind?

    – cubuspl42

    22. Juni ’14 um 0:48


  • Wie der obige Kommentar richtig zeigt, ist die ABI-Kompatibilität der Standardbibliothek nicht gleich der ABI des Compilers. Beispielsweise clang++ -stdlib=libstdc++ generiert Code, der zu 100 % ABI-kompatibel mit g++ ist. Aber heutzutage verwendet Clang -stdlib=libc++ standardmäßig (statt stdlibc++). Also – obwohl sie zum Zeitpunkt der Veröffentlichung falsch war – ist diese Antwort in den Jahren dazwischen zufällig richtig geworden, zumindest auf OSX. (Als diese Antwort geschrieben wurde, war die Standardeinstellung von clang -stdlib=libstdc++, also waren Binärdateien standardmäßig mit g++ kompatibel.)

    – Stuart Berg

    24. September ’15 um 17:45 Uhr

  • Übrigens, seit gcc 5.1 verwendet libstdc++ nicht mehr standardmäßig COW-Strings, da C++11 sie verbietet und die ABI ändert. (Einige Distributionen, zB Slackware, verwenden weiterhin das alte ABI). libstdc++ unterstützt weiterhin beide ABIs aber Sie können Objektdateien/Bibliotheken (außer libstdc++) nicht mit den verschiedenen ABIs mischen.

    – Ralph Versteegen

    6. März ’17 um 23:56


Es scheint kompatibel zu sein. Clang hat auch ein Projekt für seine eigene C++-Laufzeit, und es heißt, es sei Low-Level-kompatibel mit GNU stdlibc++. Ich habe gerade ein kleines Beispielprogramm ausprobiert, in dem ich eine Datei mit clang++ kompiliert und das Hauptprogramm mit g++ kompiliert und verlinkt habe. Bisher kein Problem, aber das Programm war ziemlich einfach.

.

212420cookie-checkIst clang++ ABI dasselbe wie g++? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy