Question

Je suis venu du monde Linux et je connais beaucoup d'articles sur le maintien de la rétrocompatibilité binaire (BC) d'une API de bibliothèque dynamique écrite dans la langue C. L'un d'eux est "Politiques / Binary Problèmes de compatibilité avec C ++" basé sur Itanium C ++ ABI , qui est utilisé par le compilateur GCC. Mais je ne peux pas trouver quelque chose de semblable pour le compilateur Microsoft C (à partir MSVC).

Je comprends que la plupart des techniques sont applicables au compilateur MS C et je voudrais découvrir spécifiques compilateur problèmes liés aux différences ABI (mise en page v-table, mangling, etc.)

Alors, mes questions sont les suivantes:

  • Connaissez-vous des différences entre MS C ++ et compilateurs GCC lors du maintien de la Colombie-Britannique?
  • Où puis-je trouver des informations sur MS C ++ ABI ou sur le maintien de la Colombie-Britannique de l'API dans Windows?

Toute information connexe sera très appréciée.
Merci beaucoup pour votre aide!

Était-ce utile?

La solution

D'abord toutes ces politiques sont d'ordre général et ne pas se référer à gcc seulement. Par exemple: marque privée / publique dans les fonctions est quelque chose de spécifique à MSVC et non gcc

.

Donc, fondamentalement, ces règles sont pleinement applicables aux MSVC et compilateur général ainsi.

Mais ...

Vous devez vous rappeler:

  1. GCC / C ++ conserve son stable ABI depuis version 3.4 et il est d'environ 7 ans (depuis 2004), tandis que MSVC brise son ABI chaque version majeure: MSVC8 (2005), MSVC9 (2008), MSVC10 (2010) ne sont pas compatibles avec l'autre.
  2. Certains fréquemment utilisés avec des drapeaux MSVC peuvent casser ABI ainsi (comme modèle Exceptions)
  3. MSVC a temps d'exécution incompatibles pour les modes de débogage et mise à jour.

Alors oui vous pouvez utiliser ces règles, mais comme dans le cas d'habitude de MSVC il a beaucoup plus de bizarreries.

Voir aussi " Quelques réflexions sur la compatibilité binaire " et Qt garde-elles stables ABI avec MSVC ainsi.

Notez que j'ai une certaine expérience avec ce que je suis ces règles dans CppCMS

Autres conseils

Sous Windows, vous avez essentiellement 2 options pour la compatibilité binaire à long terme:

  1. COM
  2. mimique COM

Vérifiez mon post ici. Là, vous verrez un moyen de créer des DLL et DLL d'accès d'une manière compatible binaire entre les différentes versions compilateurs et compilateur.

C ++ interface de plug-in DLL

La meilleure règle pour la compatibilité binaire est MSVC utilise une interface C. La seule fonction C ++, vous pouvez vous en sortir avec, dans mon expérience, est unique interfaces héritage. représentent donc tout comme les interfaces qui utilisent C types de données.

Voici une liste des choses qui sont pas binaire compatible:

  • La STL. Le format binaire change même juste entre debug / release, et en fonction des drapeaux du compilateur, donc vous êtes mieux de ne pas utiliser cross-module STL.
  • Heaps. Ne pas new / malloc dans un module et delete / free dans un autre. Il y a différents tas qui ne connaissent pas les uns les autres. Une autre raison pour laquelle la STL ne fonctionnera pas modules croisés.
  • Exceptions
  • . Ne laissez pas les exceptions se propagent d'un module à l'autre.
  • RTTI / dynamic_casting types de données à partir d'autres modules.
  • Ne pas faire confiance à aucun autre C ++ caractéristiques.

En bref, C ++ ABI n'a pas cohérente, mais C ne, afin d'éviter C ++ propose des modules de passage. Parce que l'héritage unique est un simple v-table, vous pouvez utilement l'utiliser pour exposer des objets C ++, à condition qu'ils utilisent C et ne font datatypes pas d'allocations croisées tas. Telle est l'approche utilisée par Microsoft eux-mêmes ainsi, par exemple pour l'API Direct3D. GCC peut être utile pour fournir une écurie ABI, mais la norme ne nécessite pas, et MSVC tire profit de cette flexibilité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top