Compatibilité binary des compilateurs croisés des bibliothèques C sous Windows

Ma question est similaire à celle-ci , mais concerne également les bibliothèques statiques:

Nous avons une bibliothèque d’en-tête C ++ multi-plateforme qui se construit sous Windows / Linux / Os X et qui fonctionne sur plusieurs compilateurs et 32 ​​et 64 bits. Lorsque l’utilisateur a installé zlib ou libbz2, le système de génération active certaines fonctionnalités de la bibliothèque via #ifdefs .

Pour faciliter la tâche de nos utilisateurs, nous souhaitons expédier des bibliothèques telles que zlib et libbz2 pour Windows, soit en format binary, soit en source avec quelques clics à installer. (Sous Linux et Mac Os X, les bibliothèques peuvent simplement être installées en tant que packages système, en fait, elles sont disponibles dans la plupart des installations standard, pour autant que je sache).

La solution finale devrait permettre aux utilisateurs d’utiliser les compilateurs Visual C / C ++ 2005, 2008 et 2010 ainsi que MinGW sous Windows 32 et 64 bits pour établir une liaison facile avec zlib et libbz2. Nous nous intéressons uniquement aux bibliothèques C pour le moment et à l’avenir prévisible.

Les bibliothèques doivent être construites séparément, nous ne voulons pas les intégrer dans notre système de construction.

Pour autant que je puisse voir, il y a au moins deux degrés de liberté ici:

  • S’il faut utiliser des bibliothèques statiques ou des DLL.
  • Indique s’il faut envoyer des bibliothèques binarys ou laisser les utilisateurs créer leurs propres bibliothèques.

Un autre point est que les utilisateurs devraient pouvoir relier les bibliothèques à la fois contre le débogage et les versions optimisées de leur programme. Je ne suis pas un expert de la programmation Windows, mais pour autant que je puisse trouver sur Internet et auprès d’autres développeurs au travail, il y a cette distinction (inhabituelle?) Entre les versions de débogage et de publication sous Windows. Apparemment, vous ne pouvez pas lier les programmes de débogage aux bibliothèques de versions et vice versa. Est-ce correct?

Bon, alors permettez-moi de résumer tout cela pour plus de clarté: (1) Quelle est la meilleure façon d’envoyer des bibliothèques de dépendance C pour notre compilateur C ++? (2) Si nous souhaitons par la suite expédier des bibliothèques C ++, laisser l’utilisateur construire à partir de la source avec chaque compilateur est la seule solution possible, non?

Quelle est la meilleure façon d’envoyer des bibliothèques de dépendance C pour notre compilateur C ++?

Il n’y a pas de solution parfaite, mais vous rendrez beaucoup plus facile pour vos utilisateurs l’envoi de DLL, ainsi que les fichiers d’en-tête et les bibliothèques d’importation correspondants pour les compilateurs qu’ils utiliseront, au moins pour Visual Studio. Notez que la plupart des compilateurs fournissent des outils pour créer une bibliothèque d’importation à partir d’un fichier binary DLL.

Vous pouvez également envoyer les bibliothèques sous forme de source et fournir un script qui les construit sur différents compilateurs.

Si, par la suite, nous souhaitons également expédier des bibliothèques C ++, laisser l’utilisateur créer à partir de la source avec chaque compilateur est la seule solution possible, non?

En général, l’utilisation de DLL exportant des classes et des méthodes C ++ est une très mauvaise idée, car celles-ci sont exscopes de manière dépendante du compilateur, ce qui vous oblige à fournir une DLL différente pour chaque compilateur pris en charge. Je prends les mesures suivantes lorsque je travaille avec des bibliothèques C ++:

  1. construire des bibliothèques statiques, jamais de DLL.
  2. incorporer la construction de la bibliothèque C ++ dans la construction de mon projet (en tant que projet dépendant, par exemple), en veillant à ce que tout soit construit par le même compilateur.

Si je comprends bien, vos utilisateurs sont ceux qui construisent une application, vous leur fournissez simplement votre bibliothèque d’en-tête. Donc, il me semble que dans ce cas, vous devrez documenter comment ils peuvent append une bibliothèque C ++ à leur application, et peut-être que la meilleure façon de le faire serait de fournir un exemple d’application pleinement fonctionnel qui génère également la bibliothèque C ++ à partir des sources. cibler au moins Visual Studio et tout autre compilateur que vos utilisateurs peuvent utiliser.

Bonne chance.

Pour une compatibilité binary maximale, le meilleur moyen consiste à exposer vos bibliothèques c / c ++ en tant que COM sur la plate-forme Windows.

Les objects COM peuvent être consommés à partir des langages C, C ++ et .NET