Dois-je créer un lien vers le moteur d'exécution Visual Studio C statique ou dynamique?

StackOverflow https://stackoverflow.com/questions/787216

  •  16-09-2019
  •  | 
  •  

Question

J'ai lu les arguments des deux côtés quant à savoir si l'on doit créer un lien vers la bibliothèque d'exécution C statique ou dynamique dans des projets Visual Studio, et je ne suis toujours pas entièrement sûr de ce que penser.

Mon projet tire dans certaines bibliothèques tierces (Python, HDF5, trilinos et Microsoft MPI), dont chacun doit être construit avec la même bibliothèque d'exécution que mon exécutable final (sinon ils ne peuvent pas être reliés entre eux). Lors de la liaison statique, chacune de ces bibliothèques contiendra une copie du runtime C. Je lis que cela est susceptible de causer des problèmes parce que l'exécutable final contiendra plusieurs copies du moteur d'exécution, dont aucun ne peut interagir les uns avec les autres. Mais ne serait pas l'éditeur de liens se plaindre si les mêmes symboles ont été définis se multiplient?

Je voudrais éviter « DLL Hell », mais je suis inquiet au sujet des erreurs insidieuses qui pourraient découler de la liaison statique en plusieurs exemplaires du moteur d'exécution. Est-ce que je lis des choses mauvaises?

En outre, je suis l'aide de Visual Studio 2005 et j'ai lu que le Service Pack 1 exécution n'est pas rétrocompatible. Est-ce que cela signifie qu'une application construite sans SP1 ne fonctionnera pas sur une machine qui a les dll SP1, même si elles ont le même nom (par exemple msvcr80.dll)?

Était-ce utile?

La solution

Ce lien entre statiquement météorisation tous vos fichiers EXE et DLL, et peut causer des accidents (par exemple. Si le code dans une DLL appelle libre () avec un pointeur alloué par malloc () dans une DLL différente).

Vous pouvez obtenir le meilleur des deux mondes en reliant dynamiquement et de déployer les DLL d'exécution que les assemblées privées. Cela signifie simplement mettre une copie d'un répertoire spécialement nommé contenant les DLL d'exécution et leurs manifestes à côté de votre exécutable.

Voir la section "Déploiement Visual C ++ DLLs bibliothèque que les assemblées privées" http://msdn.microsoft.com/en-us/library/ms235291 (VS.80) .aspx pour plus de détails, mais essentiellement votre application ressemble à ceci:

c:\Program Files\My App\MyApp.exe
c:\Program Files\My App\MyLibrary.dll
c:\Program Files\My App\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
c:\Program Files\My App\Microsoft.VC80.CRT\msvcr80.dll

Quant à votre dernière question, oui, la machine cible a besoin des versions correctes des DLL d'exécution au travail, mais en les déployant sous forme d'ensembles privés, vous le garantir.

Un autre avantage est que les utilisateurs non-administrateurs peuvent installer votre application (pas dans Program Files, mais ailleurs) -. Ils ne ont pas besoin la permission d'écrire des fichiers dans la zone WinSxS

Autres conseils

Le seul moment où vous aurez plusieurs copies du moteur d'exécution est lorsque vous liez statiquement une bibliothèque dans une DLL - chaque DLL obtenir une copie, et il en sera de l'exe. Si elles sont tous bibliothèques statiques et non DLL, ils vont tous les liens ensemble et toutes vos bibliothèques partagent le même temps d'exécution.

C'est le travail de l'éditeur de liens.

... Faites-statiquement ... tente de corriger l'enfer des DLL n'a pas travaillé que bien ... il suffit d'ajouter un 200k supplémentaire à votre installation avec le lien statique.

Les bibliothèques statiques à besoin À ne pas liés statiquement à d'autres bibliothèques statiques. Il vous suffit de relier toutes les bibliothèques statiques dans votre projet principal. De cette façon, le compilateur ne se plaindra pas de multiples symboles.

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