Mélange de code C ++ de différents compilateurs

Supposons que j’ai deux projets que je voudrais relier:

  • Une bibliothèque C ++ compilée avec Visual C ++ dans un fichier DLL.
  • Un exécutable C ++ compilé avec C ++ Builder qui utilise les classes de la bibliothèque.

Je me rends compte qu’il n’y a pas d’ABI C ++ standard et que toute tentative de lier directement ces deux projets C ++ échouera. Qu’est-ce qu’un bon moyen automatisé de créer une couche de compatibilité qui me permet d’accomplir cela?

Par exemple, la bibliothèque C ++ pourrait être exposée via une interface C. Ensuite, l’exécutable aurait des classes C ++ qui recouvrent l’interface C exposée par la bibliothèque C ++. Comme il existe un ABI standard pour C, cela fonctionnerait.

La seule question est de savoir comment créer automatiquement les classes d’interface C et C ++. Le projet SWIG semble prometteur, mais malheureusement, C ++ n’est pas l’une des sorties de SWIG répertoriées sur leur site Web. Est-il possible de faire ce que je veux avec SWIG? Ou existe-t-il un autre projet que SWIG qui pourrait m’aider dans cette tâche?

Ou est-ce que je vais à ce sujet dans le mauvais sens?

Edit: La bibliothèque C ++ principale est destinée à être multi-plateforme. L’exécutable est évidemment spécifique à Windows. Je ne veux pas polluer la bibliothèque principale dans la mesure où il devient impossible de la comstackr sur d’autres plates-formes.

S’il ne doit fonctionner que sous Windows, j’exposerais les classes en tant qu’objects COM. Ils seront toujours dans une DLL et ils peuvent être utilisés par n’importe quel langage comprenant COM.

La méthode standard dans Windows consiste à utiliser des objects COM. Donc, c’est certainement une bonne option à regarder. Dans les systèmes Linux, le modèle d’interaction de module (par exemple, interaction DLL exécutable) est très différent et les ABI existent pour C ++.

Si vous souhaitez le faire manuellement (créer votre propre bibliothèque COM-like), cela peut demander beaucoup de travail avec beaucoup de petites questions délicates à prendre au sérieux. Vous aurez besoin d’un système RTTI inter-modules, vous aurez besoin d’un protocole d’interrogation / définition d’interface, d’un mécanisme pour gérer la mémoire entre les modules, etc. Au-delà, vous aurez probablement besoin d’une combinaison de MACRO et méta-fonctions de modèle.

Une option multi-plateforme que je recommanderais fortement que vous envisagiez ou que vous envisagiez au moins est d’utiliser Boost.Python et le langage Python comme “colle” entre vos modules. La librairie Boost.Python fait fondamentalement l’ensemble “export / import automatisé des classes”, mais elle exporte vos classes et fonctions C ++ en tant que classes et fonctions Python. Et, il est complètement non intrusif et multi-plateforme, donc c’est vraiment un exemple idéal d’exportation automatisée. Ainsi, vous pourriez envisager d’utiliser Python pour écrire votre code de colle de haut niveau, ou utiliser Python comme intermédiaire entre les modules C ++, ou même retravailler la bibliothèque Boost.Python pour n’utiliser que les mécanismes “d’exportation automatisée”. système que vous concevez ou utilisez.

Je suis sûr qu’il y a beaucoup d’autres bibliothèques similaires sur le marché. Mais la première question est, bien sûr, avez-vous vraiment besoin de cela? Vous utilisez peut-être un bazooka pour tuer une mouche.

Pourquoi ne pas simplement comstackr la bibliothèque avec C ++ Builder aussi?

En regardant autour de swig (je savais que swig devrait pouvoir envelopper C ++ en C): SWIG et C ++

Si la bibliothèque principale est multi-plateforme, pourquoi ne pas également écrire l’interface utilisateur en tant qu’application Qt multi-plateforme et créer tout dans Visual C ++ sous Windows.