Wie bette ich eine C ++ - Bibliothek in eine C-Bibliothek ein?

8

Ich habe eine Frage bezüglich der Einbettung einer Bibliothek in eine andere.

Ich habe einen Code, der reines C ist, und meine Benutzer verlassen sich darauf, sie wollen nicht von C ++ - Bibliotheken abhängig sein. Es entstand jedoch die Notwendigkeit, eine 3rd-Party-Bibliothek (ICU) in meine einzubetten. Keine der ICU-Funktionen würde exportiert werden, sie würden nur intern in meiner Bibliothek verwendet werden. Unglücklicherweise ist ICU eine C ++ - Bibliothek, obwohl sie einen C-Wrapper hat. Die ICU verwendet keine Ausnahmen, verwendet jedoch RTTI (abstrakte Basisklassen).

Die Frage ist, wie könnte ich meine statische Bibliothek so erstellen, dass

  1. ICU ist in meine Bibliothek eingebettet (alle Verweise auf ICU-Funktionen sind in meiner Bibliothek aufgelöst)
  2. alle Verweise auf libstdc ++ sind ebenfalls aufgelöst und der notwendige Code ist in meine Bibliothek
  3. eingebettet
  4. wenn ein Benutzer nicht einmal libstdc ++ auf seinem System installiert hat, funktionieren die Dinge gut
  5. Wenn ein Benutzer meine Bibliothek in einem C ++ - Projekt verwendet, dann gibt es keine Konflikte mit dem von ihm verwendeten libstdc ++ (vermutlich dem System libstdc ++).

Ist das überhaupt möglich? Die Zielplattformen sind so ziemlich alles: Windows (dort ist meine Bibliothek dynamisch) und alle Arten von Unix-Versionen (Linux, Solaris, Aix, HPux - hier muss meine Bibliothek statisch sein).

gcc-4.5 und später hat --static-libstdc ++, aber soweit ich verstehe, ist es nur für das Erstellen von freigegebenen Bibliotheken oder ausführbaren Dateien und nicht für statische Bibliotheken.

Danke für jede Hilfe!

    
LaszloLadanyi 24.05.2014, 02:17
quelle

2 Antworten

4

Die Lösung für dieses Problem ist ziemlich einfach, kann aber nicht in die von Ihnen festgelegten Parameter fallen.

Die einfachen Regeln sind:

  1. Sie können eine C ++ - Bibliothek dynamisch mit einem C-Aufrufer verknüpfen, aber Sie müssen die Bibliothek in eine externe C-Ebene einbinden. Sie entwerfen die externe C-API und implementieren sie mithilfe von C ++ - Interna, die für immer unsichtbar sind. [Sie können COM oder .NET auch für Windows verwenden.]
  2. Sie können eine C ++ - Bibliothek nicht statisch mit einem C-Aufrufer verknüpfen. Die Bibliotheken sind unterschiedlich und die Aufrufsequenzen / Linkersymbole sind unterschiedlich. [Sie können oft nicht einmal zwischen verschiedenen Versionen desselben Compilers statisch verknüpfen, und fast nie zwischen verschiedenen Compilern.]

Mit anderen Worten, die Lösung ist einfach: Verwenden Sie dynamische Verknüpfung. Wenn das nicht die richtige Antwort ist, dann glaube ich nicht, dass es eine gibt.

Um nur die Dinge interessant zu machen, können Sie sogar Ihre eigene Plug-in-Architektur implementieren. Das ist nur ein anderer Name für das dynamische Verknüpfen, aber Sie können die API auswählen.

Nur um klar zu sein, ist die einzige praktikable portable Option, die ich sehen kann, dass Sie ICU innerhalb seiner eigenen dynamischen Bibliothek (DLL oder SO) verbinden. Seine Symbole, C ++ - Bibliotheken, RTTI und Ausnahmen bleiben dabei. Ihre statische lib verweist auf die ICU dynamische lib von extern C. Das ist genau wie viel von Windows gebaut wird: C ++ innerhalb DLL, extern C.

Sie können über die Grenze hinweg debuggen, aber Sie können keine Typinformationen exportieren. Wenn Sie dies tun müssen, müssen Sie eine andere API wie .NET oder COM verwenden.

    
david.pfx 24.05.2014, 10:30
quelle
0

Ich weiß nicht, ob das funktioniert, aber lassen Sie mich wenigstens vorschlagen, dass Sie es versuchen!

Das ausgezeichnete LLVM-Projekt (Ursprung des Clang-Compilers) hat viele Frontends und Backends für verschiedene Sprachen, wie C ++ und C Und laut dieser SO Frage sollte es für LLVM möglich sein, C ++ in C zu kompilieren, was wiederum wie üblich kompiliert werden kann.

Ich kann mir vorstellen, dass dieser Weg holprig ist, aber wenn er funktioniert, könnte er Ihr Problem lösen, ohne dass er dynamisch verbunden werden muss. Alles hängt davon ab, ob die ICU mit LLVM C ++ kompiliert wird.

Wenn Sie sich entscheiden, es auszuprobieren, lassen Sie uns bitte wissen, wie es Ihnen geht!

    
Lennart Rolland 24.05.2014 22:26
quelle

Tags und Links