Komponenten oder in klassischen und Clang-C++-Win32-Compilern geschriebene Bibliotheken packen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Komponentenentwicklung - Index

Nach oben zu Packages und Komponenten - Index


Objekte, die mit den beiden Win32-Compilern, dem klassischen (bcc32) und dem durch Clang erweiterten (bcc32c/x), erzeugt wurden, sind nicht kompatibel. Sie sind binär inkompatibel. Der Versuch, mit unterschiedlichen Compilern erzeugte Binärdateien oder Objekte, wie eine ausführbare Datei oder eine statische Bibliothek, zu linken, kann beim Linken oder zur Laufzeit zu einer Reihe von Fehlern führen. Der Linker versucht, diese Situation zu ermitteln und gibt eine Warnung aus.

Denken Sie daran, dass Entwickler Code, der mit dem klassischen Compiler compiliert wurde, nicht mit Code, der mit dem durch Clang erweiterten Compiler compiliert wurde, nicht linken sollten. Als Bibliotheksanbieter müssen Sie zwei Versionen Ihrer Bibliotheksbinärdatei für Win32 verteilen. Als Anwendungsentwickler müssen Sie sicherstellen, dass alle Bibliotheken, die Sie linken, mit demselben Compiler erzeugt wurden.

Der klassische und der durch Clang erweiterte Compiler sind kompatibel mit von Delphi erzeugten Objektdateien für Win32. Der klassische und der durch Clang erweiterte Compiler sind jedoch nicht untereinander kompatibel.

Fehlermeldungen, die auf eine Nichtübereinstimmung der Compiler hinweisen

  • Wenn für Objektdateien, die miteinander gelinkt werden sollen, unterschiedliche Compiler verwendet wurden, gibt der Linker die folgende Warnung aus:


Warning: Compiler mismatch. Module ‘foo.lib|bar’ built with the [classic|clang-based] compiler; expected the [clang-based|classic] compiler because of ‘xyzzy.obj’

Zum Beispiel:


Warning: Compiler mismatch. Module ‘foo.lib|bar’ built with the classic compiler; expected the clang-based compiler because of ‘xyzzy.obj’

Diese Warnung weist darauf hin, dass die Objektdatei "bar", die in der Bibliothek "foo.lib" enthalten ist, mit einem nicht erwarteten (in diesem Fall mit dem klassischen) Compiler erzeugt wurde. Der Linker erwartet den Clang-Compiler aufgrund der Objektdatei, xyzzy.obj, die er bereits verarbeitet hat.

Hinweis: Es gibt keine Möglichkeit, dem Linker den Compiler mitzuteilen, der für die Erzeugung der zu linkenden Objektdateien hätte verwendet werden sollen. Stattdessen sucht der Linker beim Linken nach den Compiler-Markern im ersten Objekt und nach dem Flag, wenn er Objekte findet, die sich unterscheiden.

Fehlermeldungen vor C++Builder 10.3.3

In früheren Versionen von C++Builder, bevor die Compiler-Ermittlung durch den Linker in C++Builder 10.3.3 hinzugefügt wurde, wiesen die folgenden Fehlermeldungen in der Regel auf eine Nichtübereinstimmung der Compiler hin.

  • Wenn eine mit der Clang-Toolkette erzeugte App mit einer durch den klassischen Compiler erzeugten Bibliothek gelinkt wird, können die folgenden Fehler angezeigt werden:


[ilink32 Error] Error: Unresolved external '__InitExceptBlockLDTC'
[ilink32 Error] Error: Unresolved external '_ThrowExceptionLDTC'
Error: Unresolved external '_CatchCleanup()'
  • Wenn eine mit der klassischen Toolkette erzeugte App mit einer durch den Clang-Compiler erzeugten Bibliothek gelinkt wird, können die folgenden Fehler angezeigt werden:


Error: Unresolved external '___seh_personality_v0'
Error: Unresolved external '__Unwind_SjLj_Register'
Error: Unresolved external 'std::_Xbad_alloc()'
Error: Unresolved external '___cxa_begin_catch'
Error: Unresolved external '___cxa_rethrow'
Error: Unresolved external '___cxa_end_catch'
Error: Unresolved external '__Unwind_SjLj_Unregister'
Error: Unresolved external '__Unwind_Resume'
Error: Unresolved external '___cpp_terminate'

Verwenden von Clang- oder klassischen Binärdateien für Anwendungsentwickler

Stellen Sie beim Erzeugen einer Anwendung sicher, dass alle miteinander gelinkten Binärdateien entweder mit dem durch Clang erweiterten oder dem klassischen Compiler erzeugt wurden, nicht mit einer Kombination davon.

Wenn Sie erfolgreich linken und dabei die obige Warnung ignorieren, können in Ihrer Anwendung Laufzeitfehler auftreten.

Bereitstellen von Clang- und klassischen Binärdateien für Komponenten- und Bibliotheksanbieter

Führen Sie die folgenden Schritte aus:

  • Erstellen Sie zwei Packages oder Bibliotheken: ein Package/eine Bibliothek, die mit dem klassischen Compiler compiliert wurde, und ein Package/eine Bibliothek, die mit dem Clang-Compiler compiliert wurde.
  • Das klassische Package wird im Ordner lib\win32[debug|release] gespeichert.
  • Das Clang-Package wird im Ordner lib\win32c[debug|release] gespeichert (beachten Sie das c).
  • Die Packages müssen denselben Namen haben.
  • Die klassische Toolkette sucht immer in lib\win32. Die Clang-Toolkette sucht in lib\win32c und dann in lib\win32. Das bedeutet, die Clang-Version des Package wird immer zuerst gefunden (daher müssen beide denselben Namen haben). Sollte jedoch die Clang-Version nicht gefunden werden, wird die klassische Version gefunden, was zu Fehlern führt.

Siehe auch