Question

Je dois vérifier quelque chose pour ce dont je doute. Si une bibliothèque partagée (.dll) est écrit en C, à la norme C99 et compilé sous un compilateur. Dites MinGW. Puis, dans mon expérience, il est compatible binaire et donc utilisable de tout autre compilateur. Dites MS Visual Studio. Je dis dans mon expérience parce que je l'ai essayé avec succès plus d'une fois. Mais je dois vérifier si cela est une règle.

Et en plus, je voudrais demander s'il est en effet le cas, alors pourquoi les bibliothèques écrites en C complètement, comme OpenCV par exemple ne fournissent pas de binaires compilés pour tous les différents OS? Je sais que la raison évidente serait de mettre tous les paramètres de compilation, mais à part qu'il n'y a pas droit?

EDIT: J'ajoute une autre question que je considère comme une extension logique de l'original. Est-ce pas comment on pourrait aller créer une bibliothèque source fermée? Comme l'option de donner la source est hors de la fenêtre là, donnant des binaires est le seul choix. Et dans ce cas fournir des binaires pour autant d'architectures que possible est le résultat souhaité, C étant un choix évident pour avoir la meilleure portabilité entre les systèmes et les compilateurs. Droit?

Était-ce utile?

La solution

Dans le cas spécifique des compilateurs C (GCC MSVC et / MinGW) dans le monde Windows, vous avez raison dans l'hypothèse de la compatibilité binaire. On peut relier une interface C DLL compilée par GCC à un programme dans Visual Studio. Ceci est la façon dont les projets C99 comme ffmpeg permettent aux développeurs d'applications d'écriture wiht Visual Studio. Il suffit de créer la bibliothèque d'importation avec lib.exe dans le Trouvées toolchain Microsoft de la DLL. Ou vice-versa, en utilisant les pexports de mingw.org ou mieux, MinGW-w64 de l'outil gendef, on peut créer une lib importation GCC pour une DLL MSVC produit.

Ce pauses d'interopérabilité à portée de main vers le bas lorsque vous entrez dans le monde de l'interface C ++, où l'ABI de MSVC et GCC est différent et incompatible. Il peut fonctionner, il ne peut pas, aucune garantie ne fait aucun effort et est (actuellement) se fait dans ce changement. En outre, des informations de débogage est évidemment différente, jusqu'à ce que quelqu'un écrit un générateur d'informations de débogage / écriture GCC qui est compatible avec le débogueur de MSVC (avec le soutien de gdb bien sûr).

Je ne pense pas C99 change quoi que ce soit en particulier aux déclarations de fonction ou les arguments de manière sont traités dans les définitions de symboles, donc il ne devrait y avoir aucun problème ici non plus.

Notez que comme Vijay a dit, il y a encore la différence d'architecture, donc une bibliothèque x86 ne peut pas être utilisé lors de la liaison à une bibliothèque AMD64.


Pour répondre également à votre question supplémentaire sur les binaires de source fermé et la distribution d'une version pour tous les compilateurs / architectures disponibles.

Ceci est exactement comme vous le souhaitez créer un fichier binaire source fermée. En plus de la bibliothèque d'importation, il est également très important pour les exportations de cacher de la DLL, ce qui rend la DLL elle-même inutile pour relier (si vous ne voulez pas de code client à utiliser les fonctions privées dans la bibliothèque, voir par exemple la sortie de dumpbin /exports sur une DLL MSOffice, beaucoup de choses cachées là-bas). Vous pouvez obtenir la même chose avec GCC (je crois, jamais utilisé ou essayé) en utilisant des choses comme __attribute(hidden) etc ...

Quelques points spécifiques du compilateur:

  1. MSVC est livré avec quatre (enfin, seulement trois autres dans les versions plus récentes) différentes bibliothèques d'exécution à travers / MT, / MD et / LD. En plus de cela, vous devez fournir une version pour chaque version de Visual Studio (y compris les Service Packs) pour assurer la compatibilité. Mais c'est binaire source fermée et Windows pour vous ...

  2. GCC n'a pas ce problème; MinGW relie toujours à MSVCRT.dll fourni par Windows (depuis Windows 98), équivalent / MD (et peut-être un équivalent de la bibliothèque de débogage avec / MDd). Mais je il y a qui ne garantissent pas la compatibilité binaire deux versions de MinGW (mingw.org et MinGW-w64). Ce dernier est plus complet car il offre des options 64 bits et 32 ??bits, et fournit un en-tête plus complet / set bibliothèque (y compris une partie substantielle de DirectX et DDK).

Autres conseils

La règle générale est que si votre combinaison OS / CPU a une ABI standard, et si cette ABI est assez puissant pour votre langue, la plupart des compilateurs suivront que ABI et par conséquent sera binaire compatible, vous permettant de bibliothèques de liens (partagé ou statique) compilé avec différents compilateurs pour les programmes compilés avec d'autres compilateurs très bien.

Le problème est que la plupart sont assez faibles ABIs - ils sont conçus autour de langages de bas niveau comme C et Fortran et le dos de la date des jours avant des langages orientés objet tels que C ++. Donc, ils ont tendance à l'appui de manque pour des choses comme la surcharge de fonctions, les opérateurs définis par l'utilisateur, des exceptions, contructeurs globales et Destructeurs, des fonctions virtuelles, l'héritage, et comme nécessaires par C ++.

Ce manque a été reconnu en C ++ a été conçu qui est la raison pour laquelle C ++ a extern "C" - ce qui provoque le compilateur de se limiter à l'ABI standard pour certaines fonctions, tout en désactivant tous les C supplémentaire ++ dispose que les ABIs généralement ne prennent pas en charge.

Une bibliothèque partagée ou dll compilé pour une architecture particulière peut être liée à des applications compilées par d'autres compilateurs qui ciblent la même architecture. (En architecture, je veux dire une combinaison processeur / OS). Mais il est pas pratique pour un développeur bibliothèque pour compiler contre toutes les architectures possibles. De plus, quand une bibliothèque est distribuée sous forme source, les utilisateurs peuvent créer des fichiers binaires optimisés pour leurs besoins spécifiques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top