Kann eine kompilierte C ++ 11-Bibliothek (lib, dll usw.) In älteren C ++ - Compilern verknüpft werden?

12

Könnten ältere C ++ - Compiler (z. B. VS2008 und gcc3.4) Verbindungen zu externen Bibliotheken herstellen, die in C ++ 11 geschrieben wurden?

Mein Gedanke ist, dass die C ++ 11 .lib-Dateien zu diesem Zeitpunkt nur Byte-Code sind und die älteren Compiler nicht stören sollten, wie sie generiert wurden, solange sie irgendwie auflösbar und aufrufbar sind.

Ich entwickle eine kleine Bibliothek, deren API weiterhin C ++ 03-Benutzer unterstützen sollte. Mit Blick auf die Zukunft frage ich mich, ob es in Ordnung ist, meine Bibliothek mit hilfreichen Funktionen wie std::unique_ptroder so zu implementieren , oder ob ich mich nur daran halten muss boost::.

Konafa
quelle

Antworten:

10

Vorausgesetzt, Ihre Bibliothek verwendet in ihrer Implementierung nur C ++ 11 und macht C ++ 11-Funktionen oder -Typen nicht öffentlich verfügbar. Insbesondere wenn Sie statische Verknüpfungen verwenden, ist dies möglich und sogar Standard.

Stellen Sie sich den häufigen Fall vor, in dem eine Bibliothek eine Schnittstelle auf C-Ebene verfügbar macht (die von einer Vielzahl von Clients verwendet werden kann), die jedoch intern in C ++ implementiert ist. Clients, die mit einer solchen Bibliothek verknüpft sind, müssen sich nur um die öffentliche Binär-API (exportierte Funktionen) kümmern, die Sie aus Gründen der maximalen Kompatibilität auf Legacy-C / C ++ beschränken müssen. Ein Java-Programm kann eine Verknüpfung zu C-Level-APIs herstellen, die intern in C ++ implementiert sind. Dies bedeutet nicht, dass Java "C ++ unterstützen" muss. In ähnlicher Weise kann ein C / C ++ - Client alten Stils eine Verknüpfung zu einer API auf C- oder C ++ - Ebene herstellen, die intern eine avantgardistischere Version der C ++ - oder anderer Bibliotheken verwendet. Zwei getrennte Dinge: Was ist erforderlich, um eine Verknüpfung mit der Benutzeroberfläche der Bibliothek herzustellen, und was die Bibliothek selbst intern verknüpft (oder statisch abruft).

Sie setzen Clients Ihrer Bibliothek einfach nicht den Abhängigkeiten Ihrer Implementierung aus.

Wenn Sie Ihre Abhängigkeiten (C ++ 11 oder was auch immer) statisch mit Ihrer Bibliothek verknüpfen können, ist dies sauber und in sich geschlossen. Die Bibliothek ist eine echte Black Box: nichts als Bytecode. Aber selbst wenn Ihre Bibliothek über eine "implizite dynamische" Verknüpfung mit Ihren Abhängigkeiten verknüpft ist (nicht zu verwechseln mit der expliziten Art LoadLibrary / GetProcAddress und den ähnlichen Methoden unter * nix und OS X), sollten ältere Clients dennoch in der Lage sein, eine Verknüpfung zu dieser Bibliothek herzustellen öffentliche Schnittstelle, auch wenn sie keine Verknüpfung zu den Bibliotheken herstellen konnten, von denen die Bibliothek abhängt .

jdevlin
quelle
1
Groß! Genau darauf habe ich gehofft. Ich habe nicht vor, C ++ 11 ausgiebig zu verwenden, aber es ist schön zu wissen, dass ich in meiner versteckten Implementierung ein oder zwei Lambda-Funktionen einfügen kann, wenn es mir passt. Die C- und Java-Analogien sind sinnvoll. Vielen Dank.
Konafa
4

Klingt so, als ob Sie eine neue Bibliothek für andere schreiben möchten und C + 11 als Implementierungssprache verwenden möchten. Es gibt eine Reihe von Punkten zu berücksichtigen:

  • Wenn Sie eine neue Version von C ++ einführen, müssen Sie die neuen C ++ - Laufzeitbibliotheken mit Ihrer Bibliothek bereitstellen. Ist das in Ordnung?
  • Sie sollten keine neuen C + 11-Typen in Ihrer öffentlichen Benutzeroberfläche verwenden, da diese sonst nicht aufgerufen werden können.
  • Im Allgemeinen sollten Sie komplexe Typen wie unique_ptr, sogar Vektor usw. vermeiden. Sofern Sie Ihre Bibliothek nicht als Quellcode verteilen, kann das Layout der Objekte in Ihrer Bibliothek vom Layout im Clientcode abweichen. Halten Sie sich an einfache Typen, bei denen kein Risiko für Abweichungen des Objektlayouts besteht.
Phillip Ngan
quelle