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 :
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!