Comment faire pour inclure tous les dll dans l'exe?
J'ai un Visual Studio 12 projet; code source écrit en C++, c'est un OpenCV projet. Je veux donner à mon programme compilé à quelqu'un d'autre, mais, sur d'autres PC, j'obtiens un message d'erreur sur le manque de certaines dll. Mon programme à l'aide de nombreux OpenCV (peut-être, mais pas seulement) de la dll. Comment puis-je résoudre ce problème? Peut-être dans VS 12 à disposition une option permettant d'inclure toutes les dll .exe?
Il est assez semblable question sans réponse:
inclure les dll de visual studio c++ 2008
double possible de MS Visual Studio 2012: construire statiquement exe
Vous ne pouvez pas lier les Dll de façon statique. Une DLL est structuré autour de la liaison dynamique. Oui, une liaison statique serait le chemin à parcourir, mais vous avez besoin d'une bibliothèque statique.
oui, je voulais dire lier de manière statique 🙂
réponse (sur cette page) ne m'a pas aidé. Je l'ai déjà fait cette procédure (fourni par Zaw Lin).
Vous ne pouvez pas lier les Dll de façon statique. Une DLL est structuré autour de la liaison dynamique. Oui, une liaison statique serait le chemin à parcourir, mais vous avez besoin d'une bibliothèque statique.
oui, je voulais dire lier de manière statique 🙂
réponse (sur cette page) ne m'a pas aidé. Je l'ai déjà fait cette procédure (fourni par Zaw Lin).
OriginalL'auteur Pavlo Zvarych | 2014-05-24
Vous devez vous connecter pour publier un commentaire.
Dll de soi-même ne peut pas être "statiquement" dans un fichier exécutable; qui défie complètement leur but (et, en fait, vous pouvez utiliser certains vraiment étrange vaudou astuces pour le faire, mais ce n'est ni recommandé ni devriez-vous l'essayer si vous vous posez cette question).
La solution la plus simple serait d'identifier toutes les Dll votre programme (juste de commencer le programme dans le Débogueur de générer un fichier journal répertoriant tous) et de copier les Dll dans le même répertoire que l'EXE réside dans l'; il se trouve que le répertoire contenant le fichier exécutable en est aussi le premier répertoire dans lequel le système à l'air pour les Dll avant de passer à la standad système directoris dans la configuration par défaut. Empaqueter et distribuer cette façon.
Pour donner un grossier résumé. Les étapes impliquées serait d'utiliser un outil similaire à objcopy (peut-être que vous pouvez même utiliser objcopy pour ça) ou objdump, en quelque sorte, de "dissocier" les DLL/objet partagé dans la plaine de fichiers de l'objet. Cependant Dll/objets partagés ont points d'entrée
DllMain
/_init/_fini
qui sont appelés à la fois. Aussi un couple de sections spéciales pour l'emplacement du symbole de la traduction. Dll Windows permis pour interprocessus mémoire partagée sections. etc. etc. En fin de compte, vous avez de diviser le tout dans les objets et les relier comme une bibliothèque statique.Une autre méthode consiste simplement à intégrer l'ensemble de la DLL/objet partagé que c'est comme un blob binaire à l'intérieur de l'exécutable. Dès le début du programme, la partie de l'exécutable peut être redéfinie comme un fichier virtuel / affichage du fichier et transmis à l'éditeur de liens dynamique en tant que tel.
Et encore une autre méthode de la mise en œuvre d'une coutume de l'éditeur de liens dynamiques dans l'exécutable et la laisser travailler avec le blob binaire d'une DLL embedded/objet partagé directement. – Sauf pour les dissocier/relier façon, les deux autres méthodes sont carrément effrayant (principalement pour des raisons de sécurité).
Mal. Regarde ce stackoverflow.com/questions/26103966/...
OriginalL'auteur datenwolf
le plus compliqué solution serait de construire statique opencv bibliothèques de la src, puis lier votre programme à l'encontre de ceux qui, résultant en des 1 binaires exe-chunk, qui n'utilise pas toutes les dll (en dehors de ffmpeg, ce n'est pas sûr que l'on).
de construire des bibliothèques statiques, vous aurez besoin de lancer cmake avec : BUILD_SHARED_LIBS=OFF
mais prenez une respiration profonde, avant de faire cela. lier votre programme sera sigificantly plus difficile, parce que maintenant vous avez faire le lien entre tous les zlib,libpng, quelle que soit avec des dépendances manuellement ( qui a obtenu liée facilement dans votre dll )
encore une fois, la solution la plus simple consiste à déployer tous les opencv dll avec votre programme.
OriginalL'auteur berak
Vous pouvez utiliser le Windows Dependency Walker pour déterminer les Dll votre programme doit s'exécuter.
En fait, cela ne vous dit quelles Dll votre programme a besoin pour lancer avec succès. Si vous chargez Dll dynamiquement (via la fonction LoadLibrary) alors vous êtes sur votre propre.
OriginalL'auteur Ferruccio
Si vous optez pour la solution retenue (paquet de la Dll avec le fichier EXE file), et vous ne voulez pas aller dans la difficulté de trouver les Dll à utiliser, alors vous pouvez copier tous les OpenCV Dll. Ils ne sont pas si grand (65 MO sur OpenCV 2.43). Ils sont situés à
...\opencvXXX\build\x64\vc10\bin\
où
XXX
est la version d'OpenCV. Vous pouvez utiliserx64
oux86
en fonction de votre plate-forme (32 ou 64 bits). Et la version devc
peut être différent sur votre système (vc9
,vc10
, etc...)OriginalL'auteur Hazem