2011-07-18 7 views
1

J'ai une DLL que je distribue qui ne fonctionnera pas sur certains systèmes d'exploitation Windows. En utilisant Dependancy Walker, je découvre msvcp90d.dll manquant sur ces systèmes. I NE DOIT PAS ne souhaite aucune dépendance d'exécution nécessitant le redistribuable C++, et puisque l'application qui appelle la DLL n'est pas écrite en C++, elle n'a aucune dépendance sur le redistribuable C++.Suppression de la dépendance msvcp90d.dll à partir de Windows binaire

Je devine que j'ai laissé l'option DEBUG dans les préférences de l'éditeur de liens sur quand j'ai compilé la DLL, ce qui explique pourquoi il a besoin de msvcp90d.dll?

AJOUTÉE: appologies, je collé le mauvais nom dll dans ma première question .... trop d'heures devant l'écran ...

la dll est un dll tiers que je n'ai pas écrit compilé par moi dans VS2008.

+0

msvcp90d? On dirait que vous avez quitté le débogage ainsi que la liaison dynamique utilisée. J'espère que vous construisez cette DLL d'une manière répétable en utilisant un script msbuild? J'espère que tu ne construis pas à partir de l'IDE !! –

Répondre

3

MSVCP90 n'a rien à voir avec le débogage (ce serait msvcp90 ré). Vous pouvez supprimer votre dépendance en basculant le compilateur vers/MT (au lieu de/MD). Vous devez également vous assurer que chaque bibliothèque statique que vous liez a également été compilée/MT.

Je déconseille de construire des applications/MT car cela a un effet négatif significatif sur les performances du système et rend la maintenance plus longue en cas de problème de sécurité avec le CRT. Enfin, notez que/MT signifie que votre CRT est privé. Vous devez donc vous assurer que les types CRT/STL ne traversent pas la limite de votre DLL.

Martyn

+1

"Effet négatif significatif sur la performance du système" Pourriez-vous élaborer s'il vous plaît? –

+0

Appologies, j'ai collé le mauvais nom de dll dans ma question originale –

+0

@David - si tout le monde charge msvcp90 (qui est en winsxs, généralement), le système d'exploitation ne passera qu'un seul ensemble de pages pour chaque processus. Si vous avez un lien statique, le même code est chargé plusieurs fois, gaspillant beaucoup de pages. L'impact global est significatif pour chaque personne de liaison statique supplémentaire. –

1

Il a besoin de MSVCP90.dll car la DLL a été compilée avec Visual Studio 2008 très probablement. C'est l'exécution de la version. La réponse courte est si vous ne voulez pas que les dépendances d'exécution C++ n'utilisent pas les bibliothèques C++ ou les applications.

Cependant, vous pouvez effectuer les opérations suivantes pour résoudre votre problème:

  1. Installez la version redistribuable du système cible pour satisfaire la dépendance
  2. Supprimez la dépendance à cette dll de votre application
  3. recompilation le dll contre la version de VC que vous préférez est déjà présent sur le système cible
+0

Appologies, j'ai collé le mauvais nom de DLL dans ma question initiale –

+0

Ah alors simplement compiler la DLL en version peut être suffisant pour vous ou aller sur la route statique comme d'autres l'ont suggéré. La plupart des systèmes Windows auront déjà les redistribuables d'exécution de version. – AJG85

2

Vos options que je vois les:

  1. Compilez le DLL avec l'option/MT pour utiliser la liaison statique à l'exécution C.
  2. Continuez avec la liaison dynamique à l'exécution, mais distribuez le runtime C avec votre application.
+0

+1 pour la liaison statique J'ai quitté cette option car je veux rarement le ballonnement ou d'autres problèmes qui viennent avec/MT – AJG85

+2

@ AJG85 J'aime la liaison statique. Je déteste la redistribution des temps d'exécution. Des chevaux pour les cours comme on dit. –

+0

J'aime aussi les liens statiques. Appologies, j'ai collé le mauvais nom de DLL dans ma question originale –

Questions connexes