"C++ API" (bsp. Blackberry), wie soll das gehen ohne sourcen?



  • Moin,

    ich hab da mal ne ganz blöde Frage. Ich lese in letzter Zeit immer öfter davon, dass etwas eine "C++ API" habe. Explizit nicht "C/C++-API", wo man davon ausgehen könnte, das sind halt C-Funktionen, und die kann man auch aus C++ nutzen, sondern wirklich "C++-API". Neustes Beispiel die neue QNX Plattform von Blackberry.

    Nun stellt sich mir die Frage, wie das gehen soll, da C++ ja keine standardisiertes ABI hat, also sobald man Überladung (name mangling), virtuelle Funktionen oder gar templates benutzt, ist es doch praktisch unmöglich, Fremd-DLLs zu benutzen, die mit einer anderen Compilerversion generiert wurden.

    Wie machen die das also? Schreiben die vor, man muss gcc in version 4.6.2alpha5 revision 23 build 42 benutzen, dann kann man linken (ansonsten funktioniert es nur möglicherweise vielleicht), oder liefern die den KOMPLETTEN source aus, so dass man sich die ganze Library erstmal mit seinem eigenen Compiler bauen muss? Oder ist das alles header-only, also man kompiliert sich den ganzen Kram sowieso selbst?

    Oder gibt es da noch Vodoo-Zauber, den ich nicht kenne?

    Gruß,
    Philipp


  • Mod

    ABI != API

    Und außerdem gibt es auch für C++ de facto Standards zum Binärformat. Nur ein großer Compilerbauer braut sein eigenes Süppchen, rate mal welcher 😉 .



  • SeppJ schrieb:

    Und außerdem gibt es auch für C++ de facto Standards zum Binärformat.

    Seit wann? Zumindest wüsste ich nicht das der Standard irgendein Binärformat vorschreibt, das mehr als eine C-Schnittstelle zulässt.

    SeppJ schrieb:

    Nur ein großer Compilerbauer braut sein eigenes Süppchen, rate mal welcher 😉 .

    Ich habe noch keinen Compilerhersteller erlebt, der eine C++ Bibliothek (Betonung auf C++, und damit auch auf die Standardbibliothek, Templates...) eines anderen Herstellers akzeptiert. Gerade wenn es wie hier beschrieben ohne Sourcen gehen soll (Für letzteres gibt es imho eh keinen Standard).

    Ich wüsste auch nicht wie das gehen sollte, weil nahezu jeder Hersteller ja auch seine eigene Implementierung der Standardbibliothek etc. hat (und einige wie z.B. Embacadero zudem den C++ Standard nur in Teilen unterstützen, speziell wenn es um Templates etc. geht).



  • Der Unterschied zwischen ABI und API ist mir sehr wohl bewusst!

    Meine Frage geht in die Richtung:
    Angenommen die API hat eine Funktion

    void menuEintragHinzufuegen(const std::string& name);
    

    und die lib wurde sagen wir mit gcc 4.5 kompiliert.

    Jetzt komm ich daher mit Visual C++ 2010 und rufe die Funktion menuEintragHinzufügen() auf, und gebe eine const ref auf einen std::string der MS 2010 Standardbibliothek mit. Da wäre ich aber sehr verwundert, wenn es da nicht sofort undefiniertes Verhalten gäbe.

    Oder was ist wenn die Funktion eine Exception wirft. Die krieg' ich doch nie gefangen, da die Implementierung von Exceptions auch total vendorspezifisch ist.

    Philipp


  • Mod

    @Euch beide:
    Das meine ich ja gerade: Bis auf Visual C++ sind die Compiler fast alle untereinander kompatibel. Und das gegenseitige Benutzen von Objektcode verschiedener Compiler funktioniert ebenso gut wie in C. ascs Einwand, das er keinen Compiler kennt, der eine fremde Standardbibliothek akzeptiert, kann ich nicht im geringsten nachvollziehen. Hast du immer nur Compilerpaare verglichen, bei denen einer der MSVC war?

    (Zum Thema: Vermutlich ist schon gemeint, dass man seinen Quellcode neu compilieren muss. Dazu wird's vermutlich ein Entwicklerpaket mit eigenem Compiler geben. Denn wer hat schon einen Compiler für die unterliegende Mikroarchitektur? Und dieser Compiler wird ein standardkonformer C++-Compiler sein.)



  • SeppJ schrieb:

    ascs Einwand, das er keinen Compiler kennt, der eine fremde Standardbibliothek akzeptiert, kann ich nicht im geringsten nachvollziehen. Hast du immer nur Compilerpaare verglichen, bei denen einer der MSVC war?

    Nein, aber der GCC hat nicht dazu gehört (u.a. Embacadero, Sybase...).

    Das mag vielleicht bei Compilern klappen, die gleiche Standardimplementierungen (der gleichen Version) verwenden, ansonsten zweifel ich aber mal mächtig an, das die übergabe von C++ Objekten, beispielsweide aus der Standardbibliothek über Compilergrenzen hinaus klappen kann.


  • Mod

    http://sourcery.mentor.com/public/cxx-abi

    This document was developed jointly by an informal industry coalition consisting of (in alphabetical order) CodeSourcery, Compaq, EDG, HP, IBM, Intel, Red Hat, and SGI. Additional contributions were provided by a variety of individuals.

    Hervorhebung durch mich. Der GCC hält sich ab Version 3.2 dran, ebenso natürlich die Produkte der genannten. Ich hatte jedenfalls noch keine Probleme mit wilder Mischung von GCC, Intel und IBM. Auch wenn man die Standardbibliotheken mischt. Was abundzu Probleme macht ist, wenn die Compiler Code zu einer Buildin-Funktion optimieren (der Intelcompiler optimiert beispielsweise gerne alles mögliche was mehrere Werte setzt zu seinem eigenen _intel_fast_memset), dann muss man eben noch die Bibliothek wo diese Spezialfunktionen drinstehen mitlinken. Ich habe auch irgendwo noch den Compiler von Sun rumfliegen, der vermutlich auch funktionieren würde, den ich aber nicht benutzen mag, weil er Mist ist.



  • Aber spätestens mit der neuen standardlibrary von clang geht das dann auch nicht mehr, oder?

    http://libcxx.llvm.org/

    Philipp



  • SeppJ schrieb:

    Und außerdem gibt es auch für C++ de facto Standards zum Binärformat. Nur ein großer Compilerbauer braut sein eigenes Süppchen, rate mal welcher 😉 .

    Ja, der GCC.

    Stichwort: 4 Byte/16 Byte stack alignment.

    http://math-atlas.sourceforge.net/errata.html#gccCrazy


Anmelden zum Antworten