J'ai un gros doute sur ta manière d'appeler du C++ depuis du C. Le fait de déclarer “extern "C" void fonctionEnC++()” va dire au compilateur d'utiliser la convention d'appel du C pour invoquer ta fonctionEnC++. Or, cette dernière devrait être invoquée avec la convention d'appel du C++, qui est assez différente. Il y a le name mangling que tu évoques, mais aussi certains ajouts (par rapport au C) pour gérer les exceptions, les templates, l'appel de méthodes virtuelles, etc. Cette convention est utilisée pour toutes les fonctions C++, y compris celles qui ne se servent pas de la surcharge, du code virtuel ou des exceptions.
Je ne sais plus bien comment mélanger proprement C et C++ (les esprits chagrins te diraient que c'est impossible à faire proprement). À mon avis, la meilleure chose à faire est de vérifier sur le Web (la FAQ C++ officielle évoque probablement la question).
Au passage, je crois me souvenir que l'édition de liens d'un programme C++ est une opération complexe, bien plus que l'édition de liens du C par exemple. Es-tu sûr que le bon vieux “ld” gère le C++ proprement ? Ne faut-il pas un
linker spécial ? Dans le doute, j'essaierais de faire l'édition de liens avec g++ directement, pour voir si ça vient de là.
Mais au final, pourquoi vouloir mélanger C et C++ ? Ne serait-il pas plus simple de tout faire en C++, quitte à avoir certains modules qui ne se servent jamais de classes ni de templates, etc. ? Au moins, les choses seraient claires, il n'y aurait pas de mélanges subtils de conventions d'appel.
Bon courage pour ton projet !
GuilOooo