2009-12-09 5 views
9

considerez le scénario suivant: Un liens d'application à la bibliothèque 3ème partie A.Lier statiquement contre la bibliothèque construite avec une version différente de C Runtime Library, ok ou mauvais?

A est construit en utilisant MSVC 2008 et est un lien statiquement à la bibliothèque C Runtime v9.0 (c.-à-construit avec/MT.).

L'application est construite à l'aide MSVC 2005 et est un lien statique à A et (en utilisant/MT) à la bibliothèque C Runtime v8.0.

Je peux voir des problèmes avec cela - par exemple si les types sont modifiés dans les en-têtes entre les versions de la bibliothèque d'exécution.

est-il faut prendre soin de garder les en-têtes de bibliothèque d'exécution compatibles entre les versions, ou doit-on toujours se assurer que toutes les bibliothèques liées statiquement sont des liens vers la même version de la bibliothèque d'exécution?

Répondre

13

Il devrait pas être un problème. Chaque bibliothèque est liée à son propre environnement d'exécution et fonctionne principalement indépendamment des autres bibliothèques du processus. Le problème survient lorsque les bibliothèques ABI sont mal définies. Si tout type d'objet alloué par tas est alloué dans une bibliothèque, passé à travers une limite de bibliothèque et 'libéré' dans une autre bibliothèque, il y aura des problèmes car un gestionnaire de tas différent est utilisé pour libérer un bloc du gestionnaire de tas utilisé pour allouer il.

N'importe quel type de structure, objet ou entité défini par c-runtime ne devrait pas être transmis à travers des limites où une version d'exécution différente pourrait être utilisée: - FILE * obtenu à partir d'une bibliothèque par exemple bibliothèque liée à un environnement d'exécution différent. Tant que les API de la bibliothèque n'utilisent que des types bruts, et n'essaient pas de faire passer free() dans les pointeurs, ou de passer des pointeurs vers la mémoire interne malloc() d qu'ils attendent de l'application (ou d'une autre bibliothèque) libre() ça devrait aller. Il est facile de tomber sur le FUD que "tout peut mal tourner" si c-runtimes est mélangé, mais vous devez vous rappeler que libs, et les bibliothèques dynamiques (.so/.dll/.dylib) ont été développées traditionnellement dans une grande variété de langages: permettre à un code écrit en asm, c, C++, fortran, pascal etc, de se comminiquer via une interface binaire efficace.

Pourquoi panique soudainement quand C est liée à C?

3

Ceci est un très mauvais plan. Éviter. Soit recompiler la bibliothèque en 2005 ou compiler l'application en 2008.

+2

Ce qui me déroute un peu, c'est qu'il y a probablement beaucoup d'applications qui relient les vieilles librairies tierces (à leur tour reliées aux vieilles ressources). Bien que je convienne que cela semble dangereux, cela ne semble pas dangereux dans la pratique. – Viktor

0

Pas une bonne idée du tout. Vous n'avez aucun contrôle sur les hypothèses faites par les bibliothèques d'exécution et sur la façon dont elles implémentent certains types. C'est plus susceptible de créer un désordre impie que non.

Questions connexes