Version manquante de la version 5.12 de dll

0
  • Machine Windows 7
  • QtCreator 4.8.0
  • Qt 5.12.0
  • MSVC2015 64 bits
  • Compilateur MSVC C ++ 14.0 (x86_amd64)

J'essaie de créer un programme très simple que j'aimerais partager avec mes collègues. Qt n'est pas installé sur eux et doit avoir un exécutable. J'ai échoué car l'exé avait de nombreuses dépendances que je n'ai pas pu trouver.

Pour déboguer le problème, je suis parti de zéro avec une application Qt Widgets qui ne fait rien(c'est-à-dire juste le fichier d'en-tête, main.cpp et mainWindow.cpp). Lorsque j'exécute le programme dans QtCreator, il se construit correctement et se termine avec le code 0. Un fichier exécutable est créé et en exécutant windeployqt, toutes les dll Qt requises sont copiées dans le répertoire. Cependant, les dll de Windows sont manquantes. En utilisant le gestionnaire de dépendances, je peux voir qu'il manque toute une liste de dll windows. Je ne comprends pas pourquoi tant de dll sont nécessaires pour un programme qui ne fait rien. Je suis en mesure de trouver certaines des dll dans le répertoire x64 \ ilc \ lib \ MSCRT \, mais la plupart des API-MS-WIN-CORE-xxx-xxx requises ne sont pas disponibles. J'ai lu des articles sur des sujets similaires, mais je ne pouvais pas relier les solutions proposées à ma situation. Tous les conseils sont appréciés, il s’agit d’un ordinateur portable professionnel. Par conséquent, la réinstallation de Windows n’est pas une option.

modifié lors de l'exécution de l'exécutable Qt .... (liens vers les captures d'écran ci-dessous) Premier message d'erreur

Deuxième message d'erreur, après avoir inclus VCRUNTIME140_APP.dll

Sortie de l'outil de dépendance

Danny99
la source
1
Dependency Walker se plaindra des API-MS-*fichiers même si vous les avez sur le système. "Je ne comprends pas pourquoi tant de dll sont nécessaires pour un programme qui ne fait rien." - Votre programme ne nécessite pas réellement ces fichiers.
Ramhound
Malheureusement, l'exécutable Qt demande également ces dll. J'ai modifié le message ci-dessus et inclus des captures d'écran pour montrer le premier message d'erreur. Ensuite, j'ai copié le VCRUNTIME140_APP.dll dans le répertoire et j'ai reçu le deuxième message d'erreur. À ce stade, je ne peux pas continuer car la dll demandée n'est pas présente sur mon système.
danny99

Réponses:

1

Ces DLLs m'ont également causé des maux de tête à leur époque, alors j'en profite pour exposer ce mystère une fois pour toutes.

Les API-MS-*DLL ne manquent pas vraiment - le problème vient du gestionnaire de dépendances. Ces fausses DLL ont été ajoutées dans Windows Vista datant de 2007, tandis que le gestionnaire de dépendances date de 2006 et n'a jamais été mis à jour depuis.

Nirsoft a analysé ces DLL et a montré qu’elles sont très petites et qu’elles ne contiennent en principe aucun code utile. Lorsque Windows les charge, leurs entrées d'importation sont remplacées par des appels à des fonctions réelles du noyau Windows.

L'article Sur API-MS-WIN-XXXXX.DLL et d'autres dépendances, Walker Glitches les appelle sous le nom de "Ensembles Api" et donne cette perspective historique:

Un certain effort appelé MinWin a alors commencé au cours du cycle de développement de Vista : des personnes intelligentes ont commencé à déplacer des fonctionnalités dans l’espoir de simplifier l’architecture du système d’exploitation. Pour protéger les innombrables composants de toute rupture lors d'une modification, la solution ultime a été appelée: une couche supplémentaire d'indirection. Ce niveau correspond exactement aux ensembles Api.

Par exemple, l'ensemble d'API api-ms-win-core-fibers-l1-1-1.dllest un « atome » de la fonctionnalité englobant les 5 API FlsAlloc, FlsFree, FlsGetValue, FlsSetValueet IsThreadAFiber(il est un petit untypically tel « atome »). Toutes les applications qui utilisent des fonctionnalités de fibre déclarent une dépendance à cet ensemble d’API et deviennent ainsi insensibles à l’emplacement exact de l’implémentation (qui peut varier d’une version à l’autre du système d’exploitation). Pendant le temps de chargement, le système d’exploitation recherche quelque part et achemine automatiquement les appels api-ms-win-core-fibers-l1-1-1.dll où qu’ils soient mis en œuvre dans cette version du système d’exploitation.

Les données de redirection par version de système d'exploitation se trouvent dans un fichier spécial appelé ApiSetSchema.dll. C'est techniquement une DLL (conforme à la spécification PE), mais pas une exécutable - les données de redirection se trouvent dans une section spécialisée appelée .apiset, mentionnée dans les apiset.hmacros. Sébastien Renaud a effectué un travail de retournement spectaculaire et a décrit la disposition des données de redirection qu’il contient.

Une version plus moderne du gestionnaire de dépendances, également gratuite, peut être trouvée dans Github Dependencies et permet de mieux démasquer les DLL suivantes:

entrez la description de l'image ici

harrymc
la source
Votre contribution éclaircit un peu les choses, en particulier en ce qui concerne les dépendances (je suis très nouveau dans ce domaine). Cependant, l'exécutable (celui qui ne fait rien!) Demande également ces dll. Je suis seulement allé jusqu'à la 2ème erreur, je suis incapable de traiter car cette dll n'existe pas sur mon système (autant que je sache). Article original édité et captures d'écran ajoutées ci-dessus.
danny99
Pensez-vous que cela pourrait être un problème spécifique à Qt et peut-être devrais-je poster cette question sur un forum spécifique à Qt?
danny99
Non, il n'y a pas de problème ici, si ce n'est d'utiliser un programme ancien tel que le dépendeur. Utilisez le nouveau produit Dépendances ci-dessus et vous n'aurez aucun problème, ou ignorez simplement ces messages si vous préférez continuer avec l'ancien gestionnaire de dépendances. L'ancien gestionnaire de dépendances émettra ces avertissements parasites sur presque tous les programmes Windows du monde.
harrymc
Compris. Je ne regarde plus les dépendances, mais l’exécutable lui-même demande ces fichiers lorsque je tente de les exécuter. Mise à jour Just a partagé les fichiers source du programme avec un collègue et lui a demandé de créer un fichier exécutable. Cela fonctionnait bien, un exécutable créé, aucune dll supplémentaire n'était nécessaire. Il exécute Windows 10 et une version complète de Qt. Je vais passer à une version antérieure et tenter encore une fois.
danny99
Quelles DLL manquaient? Utilisez les dépendances Github pour obtenir une liste réelle des DLL manquantes.
harrymc