Question

Est-il possible pour gcc d'établir un lien avec une bibliothèque créée avec Visual C++ ?Si oui, y a-t-il des conflits/problèmes qui pourraient en découler ?

Était-ce utile?

La solution

Certains commentaires dans les réponses ici sont légèrement trop généralistes.

Bien que non, dans le cas spécifique mentionné, les binaires gcc ne seront pas liés à une bibliothèque VC++ (AFAIK).Le moyen réel d'interconnecter le code/les bibliothèques dépend de la norme ABI utilisée.

Un standard de plus en plus courant dans le monde embarqué est le standard EABI (ou ARM ABI) (basé sur le travail effectué lors du développement d'Itanium). http://www.codesourcery.com/cxx-abi/).Si les compilateurs sont conformes à EABI, ils peuvent produire des exécutables et des bibliothèques qui fonctionneront les uns avec les autres.Un exemple de plusieurs chaînes d'outils travaillant ensemble est le compilateur RVCT d'ARM qui produit des binaires qui fonctionneront avec les binaires GCC ARM ABI.

(Le lien vers la source de code est actuellement en panne mais peut être mis en cache sur Google)

Autres conseils

Je suppose que non.Habituellement, les compilateurs C++ ont des méthodes de modification de noms assez différentes, ce qui signifie que les éditeurs de liens ne parviendront pas à trouver les symboles corrects.C'est d'ailleurs une bonne chose, car les compilateurs C++ sont autorisés par la norme à avoir des niveaux d'incompatibilité bien plus élevés que cela, ce qui fera planter votre programme, mourir, manger des chiots et étaler de la peinture sur tout le mur.

Les schémas habituels pour contourner ce problème impliquent généralement des techniques indépendantes du langage telles que COM ou CORBA.Une méthode sanctifiée plus simple consiste à utiliser des "wrappers" C autour de votre code C++.

Ce n'est pas possible.Il n'est généralement même pas possible de lier des bibliothèques produites par différentes versions du même compilateur.

Non.Clair et simple :-)

Oui, si vous en faites un lien dynamique et créez l'interface en style C.lib.exe générera des bibliothèques d'importation compatibles avec la chaîne d'outils gcc.

Cela résoudra vos problèmes de liaison.Mais ce n'est que le début du problème.

Vos plus gros problèmes concerneront des éléments tels que les exceptions et l’allocation de mémoire.

  • Vous devez vous assurer qu'aucune exception ne passe du code VC++ au code gcc, il n'y a aucune garantie de compatibilité.
  • Chaque objet de la bibliothèque VC++ devra vivre sur le tas car :
  • Ne mélangez pas gcc new/delete avec quoi que ce soit de VC++, de mauvaises choses se produiront.Cela vaut également pour la construction d'objets sur la pile.Cependant, si vous créez une interface comme create_some_obj()/delete_some_obj() vous n'utiliserez pas gcc new pour construire des objets VC++.Peut-être créer un petit objet gestionnaire qui gère la construction et la destruction.De cette façon, vous conservez RAII, mais utilisez toujours l'interface c pour la véritable interface.
  • La convention d'appel doit être correcte.Dans VC++, il existe cdecl et stdcall.Si gcc essaie d'appeler une fonction importée avec le mauvais type d'appel, de mauvaises choses se produiront.

L’essentiel est de conserver une interface simple et conforme à ANSI C, et tout devrait bien se passer.Le fait que le C++ fou continue derrière est acceptable, tant qu'il est contenu.

Oh et assurez-vous que tout le code est réentrant, sinon vous risquez d'ouvrir un tout autre can-o-worms.

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