2009-09-14 7 views
1

je voudrais demander plus de détails sur une réponse que je récemment arrivé ici (3ème): Compiled languages basicsbibliothèques de liens compilées par divers compilateurs

Si je vous écris en C et MinGW et je créer un lien vers la bibliothèque C++ compilé par VC - ça va marcher? Comment puis-je savoir à l'avance? En d'autres termes, si je suis capable de créer sans avertissements un .exe qui lie à ce C++ .dll, et que je suis en mesure d'exécuter (juste exécuter, pas d'autres tests) que .exe, cela signifie-t-il ça a marché? Wont-core dump à un moment donné? Pour être tout à fait sûr, ai-je besoin de re-compiler les sources de la bibliothèque par moi-même et le lien avec elle?

Je comprends qu'il peut y avoir un problème parfois avec la liaison C++ et le code C, mais comment savoir quand cela fonctionne et fonctionne? PS: Oui, j'ai vu Use libraries compiled... Je pensais que ma question était légèrement différente.

Répondre

1

Si j'écris en C et MinGW et je lie à 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 lier, ou peut tomber en panne si elle fait lien:

  1. La bibliothèque C++ exporte des classes C++ et méthodes, en utilisant "mangled" names, mais de MinGW de mutiler nom de C++ peut (je ne savoir) être différent de 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 mordra si l'API est tel que la mémoire est allouée sur le tas par le code VC et est supposée être libérée par le code MinGW.

  3. code VC n'est pas binaire comptible avec le code de MinGW (ne pas utiliser les mêmes conventions paramètres de passage, ne met pas en œuvre des exceptions de la même manière)

D'autre part, des raisons pour lesquelles il pourrait fonctionner:

  1. La bibliothèque C++ est écrit avec une interface de style C, par les développeurs qui avaient l'intention d'être appelé à partir d'un autre compilateur

  2. Identique à 1.

  3. Les responsables du compilateur MinGW a rendu compatible binaire avec VC

Comment puis-je savoir à l'avance?

Je ne sais pas. Si vous publiez les noms des fonctions exportées depuis la DLL et/ou le fichier d'en-tête qui déclare son API publique/exportée, cela me donnerait (ou quelqu'un d'autre) un indice très fort sur l'exportation (éventuellement incompatible) C++ méthodes de style ou exportant des fonctions de style C (plus susceptibles d'être convertibles).

Sinon, vous avez une question en deux étapes:

  1. Que faut-il (par exemple C au lieu de C++, par exemple, pas en supposant qu'ils utilisent le même tas, par exemple specifiying la convention de paramètre en passant) pour MinGW code pour invoquer le code VC?

  2. Est-ce que votre bibliothèque VC a é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 VC?

+0

"Qui a écrit cette bibliothèque VC?" C'était juste un exemple mais disons python26.dll ... Et si je suis capable d'exécuter le .exe résultant cela signifie-t-il que cela a fonctionné à 100%? –

+0

Je pourrais dire si on dirait qu'il est conçu pour être API cross-compiler-safe, si je pouvais voir son fichier d'en-tête (ou même la liste des noms des fonctions qu'il exporte). De plus, le fait de pouvoir l'exécuter ne garantit pas 100% (par exemple, il peut y avoir une corruption du tas qui n'apparaîtra que plus tard, ou par exemple c'est OK jusqu'à ce qu'une exception soit lancée) ... mais, pouvoir l'exécuter est semble certainement être un bon pas dans la bonne direction! – ChrisW

5

Oui, vous pouvez convertir des bibliothèques compilées MSVC pour MinGW sans recompilation.
Vous n'avez besoin que de quelques outils et de la DLL. Découvrez here. En ce qui concerne le mixage C et C++ - si vous n'êtes pas inquiet de la taille de votre binaire, 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 que vous liez.

+0

+1 pour lier aux outils, mais supposer que C compilera en C++ sans erreur est très naïf. –

+0

Il semble être une bonne idée d'essayer de changer le code source C dans un état tel qu'il sera compilé en C++, car cela n'est généralement pas très difficile, car cela simplifierait probablement considérablement le processus de construction. –

Questions connexes