2011-10-21 3 views
0

si j'ai écrit une bibliothèque en C++ et si j'ai des liaisons pour C, Ada, Fortran, D & autres langages compilés.une bibliothèque peut contenir plusieurs liaisons

toutes ces liaisons pourraient-elles être dans le même binaire avec le code compilé C++ même si elles utilisent les mêmes noms de fonctions?

et pourriez-vous utiliser les fixations comme ça?

+0

Probablement pas, mais je ne sais pas réellement. –

Répondre

1

Selon la façon dont vous créez vos liaisons une bibliothèque peut ne pas être même nécessaire:

  • Manchettes écrit quelques interprète API spécifiques:

Par exemple, les extensions de rubis écrit en utilisant l'API IRM, sont essentiellement une bibliothèque partagée fournissant un:

void init_Modulename() 

Cette fonction utilise alors l'api IRM comme rb_define_module, rb_define_class, rb_define_method, etc pour envelopper les API C/C++. Assurez-vous que cette fonction est entourée d'un "C" externe afin que son nom ne soit pas altéré au format C++.

Normalement, cette bibliothèque partagée est liée à la bibliothèque que vous liez, mais rien n'empêche qu'il s'agit de la même bibliothèque partagée.

  • lors de l'exécution reliures de

Par exemple, en utilisant les liaisons FFI sur Ruby et d'autres interprètes. Les liaisons sont définies dans le même langage et c'est la bibliothèque FFI qui sait comment appeler les méthodes de la bibliothèque cible lors de l'exécution. Par conséquent, dans ce cas, les liaisons elles-mêmes n'ont pas de "bibliothèque".

  • reliures de générateurs avec

Si vous utilisez un générateur, comme SWIG, il scanne les en-têtes de bibliothèque et de générer les liaisons pour les différentes langues. Selon la façon dont ces cibles sont implémentées par le générateur SWIG (par exemple, pour Ruby utilise l'API MRI décrite ci-dessus), SWIG créera du code que vous pouvez compiler dans sa propre bibliothèque, mais tant que vous n'avez pas de conflits de symboles, vous pourrait aussi bien compiler cela avec votre bibliothèque. Lorsque je veux dire des conflits de symboles, je ne parle pas de l'API elle-même, mais des assistants de liaison, comme init_Modulename().

1

Vous pouvez lier C++ avec C, à condition que vous n'appeliez que des fonctions de style C (en dehors des objets) et que vous ayez désactivé le nommage dans l'en-tête via "extern C". Surtout si vous utilisez le même compilateur. Différents compilateurs causeront des problèmes s'ils utilisent différents formats obj. Je ne sais pas sur ADA/Fortran/D, mais je soupçonne que la réponse sera non, au moins directement via les fichiers .LIB ou .OBJ. Sur Windows, vous pouvez essayer via DLL si ADA/FORTRAN/D prend en charge la liaison dynamique (ou vous pouvez appeler Windows api LoadLibrary).

Ce n'est pas une chose facile à faire et j'ai passé sous silence les détails. Si vous voulez vraiment essayer, vous devrez spécifier les plates-formes et les compilateurs que vous utilisez et je vais essayer d'être plus précis.

1

Oui.Un exemple (légèrement inversé) est PlPlot; il est écrit en C et a des liaisons à Ada, C++, D, Fortran77, Fortran95, Java, Lua, OCaml, Python, ...

Questions connexes