2009-09-01 7 views
1

Comment construisez-vous une bibliothèque (static lib ou dll/so) afin qu'elle ne soit pas sensible aux futures mises à jour des librarires d'exécution C du système?C Compatibilité de la version de la bibliothèque d'exécution: les mises à jour nécessitent des recréations?

À la fin de Juillet, Microsoft updated un groupe de bibliothèques, y compris les bibliothèques d'exécution C. Notre application est écrite avec un mélange de MFC/C++/VB et certaines bibliothèques tierces, y compris certaines qui sont à source fermée.

J'ai été occupé à recompiler toutes les bibliothèques dont nous avons la source, mais je me demande si c'est vraiment nécessaire? Que se passera-t-il si nous lions ou chargeons une bibliothèque construite avec une version antérieure du runtime C?

Lors de la recompilation de ce matériel, quels sont les paramètres du compilateur et de l'éditeur de liens qui doivent être identiques entre l'application principale et les bibliothèques de support? J'ai découvert que le réglage de la bibliothèque d'exécution doit être le même (nous utilisons la version multi-threaded/MD et/MDd), mais je suis inquiet pour les autres paramètres. J'ai extrait tous les paramètres dans les feuilles de propriétés de Visual Studio et j'utilise les mêmes feuilles pour tous nos différents projets, mais cela ne fonctionne pas pour les bibliothèques tierces et je pense que c'est excessif.

J'ai remarqué que l'éditeur de liens crachera un warning sur les bibliothèques en conflit, mais il suggère d'ignorer simplement les bibliothèques par défaut. Est-il sécuritaire de le faire? Cela semble être une solution très laide au problème.

Répondre

1

Si vous chargez les bibliothèques 3ème partie comme DLL, ils peuvent dépendre de différentes versions d'exécution que votre exécutable tant que

  • vous n'êtes pas remise paramètres de types, qui dépendent des libs d'exécution (comme types STL)
  • 3ème partie lib est capable de charger la version du moteur d'exécution, qu'il a été construit avec ou est statiquement lié à l'exécution

donc, vous n'avez pas à recompiler le DLL. Si vous êtes en mode statique avec ou si vous remettez des types définis dans les DLL d'exécution, vous risquez d'avoir des problèmes avec les symboles déjà importés dans votre bibliothèque. Il est donc probable que vous devrez recompiler il.

+0

Hmmm ... donc seules les primitives doivent être passées dans la bibliothèque. Chaque bibliothèque que j'ai utilise des trucs de la bibliothèque standard (comme std :: string) ou des trucs MFC (comme CString). Est-ce que la dernière partie de votre réponse signifie que si je peux lier, alors je vais très bien aller? Quand je regarde autour des bibliothèques sur le net, ils disent souvent VS2005 ou VS2008 pour leur version, mais pas la version réelle de CRT (comme 8.0.50727.4053). Donc, de toute évidence, quelque chose qui compte est différent entre VS2005 et VS2008, mais les différences au sein d'une version n'a pas d'importance? – criddell

+0

En ce qui concerne la liaison statique, l'éditeur de liens devrait donner des avertissements en cas de problème. Si vous utilisez des DLL et passez des types STL, l'éditeur de liens peut ne pas déterminer la version d'exécution correcte et votre application va planter au moment de l'exécution. Si vous utilisez des DLL, ces DLL fonctionneront normalement avec une version plus récente des DLL d'exécution, à moins que la DLL ne repose sur certains bogues d'exécution ou que Microsoft change de définition de type. Donc, normalement, il devrait être prudent de changer les DLL d'exécution si la version reste la même, mais la seule façon d'être sûr est de ne pas passer les types STL ou de les recompiler. – Bernd

1

Si vous ou vos composants tiers sont en liaison statique avec des bibliothèques C obsolètes, cela fonctionne; les mises à niveau de ces bibliothèques n'affecteront pas votre programme. Bien sûr, vous ne bénéficierez pas de corrections de bogues, de mises à niveau de performances ou de quoi que ce soit. Si vous recompilez votre code pour tirer parti de vos nouveaux paramètres, tous les commutateurs d'exécution doivent être identiques. C'est toujours le cas, peu importe quand ou pourquoi vos bibliothèques sont compilées. Il est probablement sûr d'ignorer les bibliothèques par défaut (je le fais depuis des années sans difficulté).

Les bibliothèques liées dynamiquement sont une autre histoire. Si vous comptez sur le système cible ayant une version particulière d'une DLL donnée, et qu'il a une autre version incompatible à la place, alors vous êtes foutu. La solution traditionnelle à ce problème consiste à regrouper toutes les DLL dont vous avez besoin avec votre exécutable. Le nouveau système d'assemblage côte-à-côte de Microsoft pourrait également être utile, mais il a toujours été un peu trop difficile à configurer pour que je m'en préoccupe. Vous pourriez avoir plus de chance.

+0

Je pensais que les bibliothèques liées statiquement étaient les plus sensibles. Est-ce que ce sera un problème si, par exemple, mon application et une bibliothèque ont des gestionnaires de tas différents? En ce qui concerne les commutateurs critiques-toute idée où je pourrais trouver une liste de ceux-ci?Je pense que les paramètres liés à la gestion des exceptions, à l'empaquetage de structure, au modèle à virgule flottante, etc ... sont critiques mais j'aimerais avoir de la documentation à ce sujet. Chaque fois qu'il y a un bump dans la version c runtime sur mon système, dois-je appeler nos fournisseurs de bibliothèques pour demander de nouvelles constructions? – criddell

Questions connexes