Bibliothèques de liens compilées par différents compilateurs

Je voudrais demander plus en détail une réponse que j’ai récemment obtenue ici (3ème): Notions de base sur les langages compilés

Si j’écris en C et MinGW et que je fais un lien vers la bibliothèque C ++ compilée par VC, cela fonctionnera-t-il? Comment puis-je savoir à l’avance?

En d’autres termes, si je suis capable de créer sans avertissements un fichier .exe qui renvoie à ce fichier .dll C ++, et que je peux exécuter (exécuter simplement, aucun autre test) ce fichier .exe, cela signifie-t-il que cela a fonctionné? Ne va-t-il pas y aller à un moment donné?

Pour être tout à fait sûr, dois-je recomstackr moi-même les sources de la bibliothèque et le lien avec elles?

Je comprends qu’il peut parfois y avoir un problème avec la liaison de code C ++ et C, mais comment savoir quand cela fonctionne?

PS: Oui, j’ai vu les bibliothèques d’utilisation compilées … Je pensais que ma question était légèrement différente.

Si j’écris en C et MinGW et que je fais un lien vers la bibliothèque C ++ compilée par VC, cela fonctionnera-t-il?

Cela dépend des compilateurs (et je ne connais pas MinGW) et de la bibliothèque C ++ spécifique.

Raisons pour lesquelles il pourrait ne pas être lié, ou pourrait planter s’il le faisait:

  1. La bibliothèque C ++ exporte des classes et des méthodes C ++, en utilisant des noms “mutilés” , mais le nom C ++ de MinGW peut être différent (je ne sais pas) que les VC (et inexistant lorsque vous codez en C au lieu de C ++)

  2. Le code VC n’utilise pas la même bibliothèque d’exécution C que MinGW, ce qui vous piquera si l’API est telle que la mémoire est allouée sur le segment de mémoire par le code VC et est ensuite supposée être libérée par le code MinGW.

  3. Le code de VC n’est pas binary avec le code de MinGW (n’utilise pas les mêmes conventions de passage de parameters, ne met pas en œuvre les exceptions de la même manière)

D’autre part, quelques raisons pour lesquelles cela pourrait fonctionner:

  1. La bibliothèque C ++ est écrite avec une interface de style C, par les développeurs qui souhaitaient l’appeler à partir d’un compilateur différent

  2. Identique à 1.

  3. Les fabricants du compilateur MinGW l’ont rendu compatible binary avec VC

Comment puis-je savoir à l’avance?

Je ne sais pas. Si vous publiez les noms des fonctions exscopes à partir de la DLL et / ou le fichier d’en-tête qui déclare son API publique / exscope, cela me donnerait (à quelqu’un d’autre) un très bon indice pour savoir s’il s’agit d’exporter (éventuellement incompatible) C ++. des méthodes de style ou des fonctions de style C exportasortingces (plus susceptibles d’être compatibles).

Sinon, vous avez une question en deux étapes:

  1. Que faut-il (par exemple, C au lieu de C ++, par exemple, en ne supposant pas qu’ils utilisent le même segment de mémoire, par exemple en spécifiant la convention de passage de paramètre) pour que le code MinGW appelle le code VC?

  2. Votre bibliothèque de VC a-t-elle été écrite dans cet esprit?

Quelqu’un qui a utilisé les deux compilateurs pourrait probablement répondre à la première question (je n’ai pas utilisé MinGW). Je ne sais pas qui pourrait répondre à la seconde; qui a écrit cette bibliothèque de VC?

Oui, vous pouvez convertir les bibliothèques compilées MSVC pour MinGW sans recomstackr.
Vous n’avez besoin que de quelques outils et de la dll. Découvrez ici .

En ce qui concerne le mélange de C et C ++ – si vous n’êtes pas inquiet pour la taille de votre fichier binary, utilisez simplement le compilateur c ++ pour vos projets c. De cette façon, vous ne serez pas inquiet des problèmes possibles avec les bibliothèques auxquelles vous vous connectez.