En fait, dés le moment où tu fournis une interface "extern C", les symboles créés seront décorés à la manière C, et donc accessible depuis C.
Seulement, tu n'auras qu'une interface C qui... utilisera les possibilités de C++ à plus d'un terme:
Soit parce que ton interface utilise en interne des classes et structure "C++" perso
Soit parce que ton interface ou tes classes et structures C++ perso utilisent des éléments de la bibliothèque C++ (cout dans ton propre exemple).
Ce qui est propre à C++ (classes, fonctions membres, utilisation de la bibliothèque C++) nécessite au minimum la compilation avec g++ (le compilateur C++ de la collection Gcc).
Si certaines parties de ton code sont marquées "externC", g++ créera des symboles décorés "à la mode C" pour les parties correspondantes, ce qui les rendra accessibles depuis une application C.
La seule chose qu'il te manquera alors, lorsque tu voudras compiler ton application C en utilisant l'interface C de ta bibliothèque, c'est la liaison avec la bibliothèque C++ (stdc++), parce que, par défaut, ld est lancé depuis Gcc (et non g++) sans l'option -stdc++ qui est automatiquement ajoutée quand ld est lancé depuis g++.
Par contre, si tu prends la peine de rajouter cette option au moment où tu invoque gcc, ou au moment où tu invoques toi-même ld, il n'y aura plus de problème
Ainsi, tu peux envisager d'avoir un commande sous la forme de
gcc hello.c -lstdc++ -ltaLibPerso
ou sous la forme de
1 2
| gcc hello.c -o hello.o
ld hello.o -lstdc++ -ltaLibPerso -o nomExecutable |
Mais ce qui importe surtout, c'est que l'édition de liens se fasse bel et bien en ajoutant... libstdc++ comme bibliothèque à utiliser lors de la recherche des différents symboles utilisés par ton application
Partager