Packaging des composants ou des bibliothèques écrites avec les compilateurs classiques et les compilateurs Win32 C++ Clang
Remonter à Guide du concepteur de composants - Index
Remonter à Utilisation des packages et des composants - Index
Les objets construits avec les deux compilateurs Win32, le compilateur classique (bcc32) et le compilateur amélioré par Clang (bcc32c/x), ne sont pas compatibles. Ils sont incompatibles au niveau binaire. Toute tentative de liaison de binaires ou d'objets tels qu'un exécutable et une bibliothèque statique construits avec des compilateurs différents peut provoquer des erreurs lors de la liaison ou de l'exécution. Le lieur tente de détecter cette situation et envoie le cas échéant un message d'avertissement.
Il est important de garder à l'esprit que les développeurs ne doivent pas lier le code compilé par un compilateur classique avec le code compilé par un compilateur amélioré par Clang et vice-versa. Si vous êtes un fournisseur de bibliothèques, vous devez distribuer deux versions du binaire de votre bibliothèque pour Win32. Si vous êtes un développeur d'applications, vous devez vous assurer que toutes les bibliothèques liées entre elles sont construites avec le même compilateur.
Le compilateur classique et le compilateur amélioré par Clang sont compatibles avec les fichiers objets Win32 générés avec Delphi. Toutefois, les deux compilateurs ne sont pas compatibles entre eux.
Sommaire
Messages d'erreur indiquant une incompatibilité du compilateur
- Lorsque des compilateurs différents sont utilisés avec des fichiers objets qui sont liés entre eux, le lieur peut émettre les avertissements suivants :
Warning: Compiler mismatch. Module ‘foo.lib|bar’ built with the [classic|clang-based] compiler; expected the [clang-based|classic] compiler because of ‘xyzzy.obj’
Par exemple :
Warning: Compiler mismatch. Module ‘foo.lib|bar’ built with the classic compiler; expected the clang-based compiler because of ‘xyzzy.obj’
Cet avertissement signale que le fichier objet 'bar' contenu dans la bibliothèque 'foo.lib' a été construit avec un compilateur inattendu (en l'occurrence le compilateur classique). Le compilateur Clang aurait dû être utilisé suite au traitement préalable d'un fichier objet, xyzzy.obj.
Messages d'erreur antérieurs à C+Builder 10.3.3
Dans les versions antérieures de CBuilder (avant que la détection du compilateur ne soit ajoutée dans C+Builder 10.3.3), les messages d'erreur suivants indiquaient une incompatibilité du compilateur.
- Lorsqu'une app construite avec la chaîne d'outils Clang est liée à une bibliothèque construite avec un compilateur classique, vous obtenez les erreurs suivantes :
[ilink32 Error] Error: Unresolved external '__InitExceptBlockLDTC' [ilink32 Error] Error: Unresolved external '_ThrowExceptionLDTC' Error: Unresolved external '_CatchCleanup()'
- Lorsqu'une app construite avec la chaîne d'outils classique est liée à une bibliothèque construite avec Clang, vous obtenez les erreurs suivantes :
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'
Utilisation de binaires classiques ou Clang pour les développeurs d'applications
Si vous construisez une application, assurez-vous que les binaires liés entre eux sont construits soit avec un compilateur amélioré par Clang, soit avec un compilateur classique.
Si vous réusissez à effectuer la liaison en ignorant cet avertissement, votre application risque de rencontrer des problèmes d'exécution.
Générer des binaires à partir de compilateurs Clang et de compilateurs classiques pour les éditeurs de bibliothèques et de composants
Suivez ces étapes :
- Créez deux packages ou deux bibliothèques : compilez pour cela le package ou la bibliothèque avec un compilateur classique et un compilateur Clang.
- Le package classique est stocké dans le dossier lib\win32[debug|release].
- Le package Clang est stocké dans le dossier lib\win32c[debug|release] (notez le C).
- Les packages doivent porter les mêmes noms.
- La chaîne d'outils d'un compilateur classique utilise toujours lib\win32 comme cible de ses recherches. Celle d'un compilateur Clang utilise d'abord lib\win32c puis lib\win32. Cela signifie que la version Clang du package est toujours trouvée en premier (c'est pourquoi les deux versions doivent porter le même nom), mais si la recherche n'aboutit pas, c'est la version classique qui est trouvée. Ce qui génère des erreurs.