Maison > développement back-end > C++ > Les objets compilés avec différentes normes C peuvent-ils être liés entre eux en toute sécurité ?

Les objets compilés avec différentes normes C peuvent-ils être liés entre eux en toute sécurité ?

Mary-Kate Olsen
Libérer: 2024-12-17 03:07:24
original
347 Les gens l'ont consulté

Can Objects Compiled with Different C   Standards Be Linked Together Safely?

Les objets compilés avec différentes normes C peuvent-ils être liés en toute sécurité ?

Supposons que vous ayez trois objets compilés (A, B, C) de la même version du compilateur. Ils ont été compilés avec différents standards C : respectivement C 11, C 14 et C 17. Cependant, les en-têtes ont tous été écrits en C 11 et utilisaient des constructions avec une sémantique inchangée dans toutes les versions.

Considérations GCC

Pour GCC, lier n'importe quelle combinaison de ces objets est sûr. Les versions standard (c'est-à-dire les options -std) ne sont pas pertinentes puisque les objets sont compatibles ABI s'ils sont construits avec la même version de GCC.

Cependant, des problèmes surviennent si des objets compilés avec différentes versions de GCC utilisent des fonctionnalités instables de la nouvelle version de GCC. C avant que le support de GCC ne soit complet. Par exemple, lier des objets compilés avec GCC 4.9 et 5 avec -std=c 11 pourrait causer des problèmes car la prise en charge de C 11 était expérimentale dans GCC 4.x. De même, lier des objets de GCC 7 et 8 avec -std=c 17 pourrait causer des problèmes en raison de l'évolution du support expérimental de C 17.

En revanche, toute combinaison des objets suivants fonctionnera :

  • Objet D compilé avec GCC 4.9 et -std=c 03
  • Objet E compilé avec GCC 5 et -std=c 11
  • Object F compilé avec GCC 7 et -std=c 17

La prise en charge de C 03 étant stable, les composants C 03 sont compatibles avec tous les objets. Les objets E et F utilisent des versions stables de C 11 et l'objet D n'utilise pas les fonctionnalités de C 11. Les fonctionnalités C 17 de l'objet F n'affectent pas les autres objets, car ils partagent uniquement les composants C 03 ou C 11. Compiler un quatrième objet, G, avec GCC 8 et -std=c 17 nécessiterait de recompiler F avec la même version (ou de ne pas créer de lien vers F) pour garantir la compatibilité des symboles C 17.

Pour les programmes utilisant libstdc .so bibliothèque partagée, elle doit être au moins aussi récente que la version GCC utilisée pour compiler l'un des objets. Pour la compatibilité entre les objets utilisant std::string, tous les objets doivent être compilés avec la même implémentation de chaîne. Utilisez -D_GLIBCXX_USE_CXX11_ABI=0 pour l'implémentation d'origine et -D_GLIBCXX_USE_CXX11_ABI=1 pour la nouvelle implémentation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal