Visual Studio 2015 dépendances d'exécution ou comment se débarrasser de Universal CRT?
Compilé quelques .dll à l'aide de visual studio 2015, et a essayé de déployer sur certains vieux windows 7 /64 bits. On a aussi essayé de deviner qui de dll sont nécessaires pour l'application à démarrer et copié MSVCP140.DLL & VCRUNTIME140.DLL - mais l'application n'a pas pu charger vs2015 dll. Commencé à analyser ce qui est faux - et dependency walker a montré les dépendances de la suite de dll:
API-MS-WIN-CRT-MATH-L1-1-0.DLL
API-MS-WIN-CRT-HEAP-L1-1-0.DLL
API-MS-WIN-CRT-CONVERT-L1-1-0.DLL
API-MS-WIN-CRT-STRING-L1-1-0.DLL
API-MS-WIN-CRT-STDIO-L1-1-0.DLL
API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL
API-MS-WIN-CRT-FILESYSTEM-L1-1-0.DLL
API-MS-WIN-CRT-TIME-L1-1-0.DLL
Cela était particulièrement surprenant, car de mon mieux comprendre le CRT est responsable de départ dll/exe, il ne fournit pas de services du niveau supérieur.
Ok, j'ai essayé de comprendre comment se débarrasser de, ou à tout le moins, à réduire.
Trouvé un article:
https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/
Il mentionne à propos de la libération des bibliothèques statiques - j'ai donc pensé que je pouvais le lien contre eux et de se débarrasser de *L1-1-0.DLL* la dépendance de l'enfer, mais peu importe ce que j'ai essayé - je n'ai eu aucun succès. J'ai essayé de relier contre libvcruntime.lib, libucrt.lib, libcmt.lib, a essayé de le désactiver à l'aide de l'éditeur de liens option "/nodefaultlib:vcruntime.lib", et même essayé d'ajouter le répertoire include $(UniversalCRT_IncludePath), et également primordial certains de définir comme j'ai essayé de deviner qu'ils fonctionne - aucune de mes tentatives ont aidé.
Comme une solution intermédiaire que j'ai tomber en arrière à l'aide de Visual studio 2013, où CRT dll ne sont que deux: msvcp120.dll, msvcr120.dll.
Bien sûr, vous allez probablement vous recommandons d'installer Visual studio 2015 run-temps, mais l'un de nos exigence est de soutenir exécutable autonome qui fonctionne sans aucune installation si l'installation supplémentaire est hors de question pour le moment.
Pouvez-vous me recommander autre chose que d'attendre Visual studio 2017 pour arriver ?
source d'informationauteur TarmoPikaro
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure de résoudre ce problème en définissant le
C/C++ > Code Generation > Runtime Library
option du compilateur/MDd
à/MTd
/MD
à/MT
Ce enlevé toutes les
API-MS-WIN-CRT-*
et dll d'exécution de références et provoqué le CRT code pour être lié statiquement.Des détails sur la nouvelle VS2015 Universelle CRT (dynamiques et statiques) sont ici:
https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx
Moi aussi, j'étais en lutte avec la liaison statique une solution avec plusieurs composants/projet dépendances de la bibliothèque de l'importation de fonctions de différentes régions de la MSVCRT, UCRT et le Noyau. L'espoir était l'EXE résultant pourrait être juste copié autour de l'endroit où il a été nécessaire (c'était pas le produit qui justifie une MSI complet de l'installation).
Après près de donnant-up, j'ai trouvé la meilleure solution était de suivre les lignes directrices caché dans le Universel C Runtime annonceen particulier:
Suffit d'enlever toutes les "spéciales" options du linker vous avez essayé, drop-retour à l' /MT|/MD (Multi-Threaded CRT DLL Release|Debug) bibliothèque d'exécution de choix et il fonctionne partout, par exemple plus récente de Windows 10 postes de travail, 2012 R2 et Windows 7). Il suffit d'installer/de redistribuer MSVCRT (VC_Redist*.exe) et KB2999226 (UCRT via Windows Update) que Microsoft nous disent de faire, parce que, comme ils disent aussi:
Donc, logiquement, le seul déploiement supplémentaire de la dépendance de nos C++ solutions pour le client est le MSVCRT, parce que le UCRT devrait déjà être là, sur up-to-date/machines bien entretenues. Bien sûr, il ajoute un peu d'incertitude; vous ne pouvez pas simplement copier l'EXE et l'exécuter sur n'importe quelle machine, bon ou mauvais.
Si vous produisez un décent package de déploiement comme une MSI alors c'est simple: lorsque vous utilisez des outils comme WIX. Aussi à noter, c'est depuis la récente SDK, vous pouvez inclure le 40-impair Dll localement, mais cela ne satisfait pas la mise à jour de sécurité principe donc je ne le ferais pas.
C'est vraiment la seule façon de le faire, voir un autre exemple ici. Cet article suggère également que nous lien contre "mincore_downlevel.lib" qui est un truc important, crucial pour savoir si vous obtenez ces "api-ms-win*" manquant DLL erreurs. Par exemple:
En résumé:
(Mise à jour 11.10.2016).
Il est possible de se débarrasser de l'universel CRT par des liens de manière statique, j'y reviendrai plus tard, mais nous allons prendre
un coup d'oeil si vous continuez à utiliser universelle CRT en tant que tel.
Conformément à l'article https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/ -
il est possible de lancer votre application en utilisant universelle crt dll distributables de dossier suivant:
C:\Program Files (x86)\Windows Kits\10\Redist\ucrt
Il y a 41 fichiers totalement dans la liste avec l'1.8 Mo taille totale. (exemple pour la plate-forme 64 bits)
Bien sûr, il n'est pas suffisant, vous aurez besoin de plus vcruntime140.dll & msvcp140.dll venant de dossier suivant:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x64\Microsoft.VC140.CRT
Alors, après que vous l'expédier totalement 43 dll supplémentaires du côté de votre application.
Il est également possible de compiler en statique ucrt bibliothèque à l'intérieur de votre demande et après vous n'aurez pas besoin de 43 dll -
mais si le lien statique sera pour après la liaison ou non dépend de votre application - combien de dll, ce qui les api sont en cours d'utilisation.
Généralement, après ucrt obtient lié en deux dll, ils ne sont pas forcément partager les mêmes globals les uns avec les autres - ce qui peut résultats dans les erreurs.
Vous avez besoin de relier contre vcruntime.lib /msvcrt.lib, mais il n'est pas suffisant - il y a des
_VCRTIMP=
et_ACRTIMP=
définit qui doit être désactivé depuis le tirage des fonctions de ucrt.
Si vous utilisez premake5 vous pouvez configurer votre projet comme ceci:
suivie par:
Définit ne sont pas documentés par Microsoft, donc il est possible qu'il est sujet à changer dans le futur.
En plus de vos propres projets, vous aurez besoin de re-compiler toutes les bibliothèques statiques qui sont à utiliser dans vos projets.
Comme pour les bibliothèques boost - j'ai réussi à compiler boost ainsi, à l'aide de b2.exe boostrapper
boost>call b2 threading=multi toolset=msvc-14.0 address-model=64 --stagedir=release_64bit --build-dir=intermediate_64but release link=static,shared --with-atomic --with-thread --with-date_time --with-filesystem define=_VCRTIMP= define=_ACRTIMP=
Lors de la résolution de relier les problèmes de l'avis que les
__imp*
les noms de fonction de raison dedllimport
l'utilisation du mot clé -et si vous vous liez à l'encontre de libvcruntime.lib, vous ne devriez avoir aucun
__imp*
références.J'étais trop eu beaucoup de mal à trouver le temps d'exécution des Dll nécessaires pour exécuter une application qui a été créé dans Visual Studio 2015.
Ici, j'ai constaté les choses suivantes qui permettent VS-2015 application à exécuter.
Remarque : Placer les dll versions en fonction de votre système de processeur d'architecture(x86, x64..).