Wie alle dll in exe?
Habe ich eine Visual Studio-12-Projekt; source-code in C++ geschrieben; es ist ein OpenCV Projekt. Ich wollte meine kompilierte Programm an jemand anderes, aber auf dem anderen PC, ich bekommen eine Fehlermeldung über fehlende dlls. Mein Programm mit vielen OpenCV (vielleicht nicht nur) dll. Wie kann ich das problem zu beheben? Vielleicht im VS 12 verfügbare option umfasst alle dll ' s in .exe?
Es ist eine ziemlich ähnliche Frage ohne richtige Antwort:
gehören dlls in visual studio c++ 2008
möglich, Duplikat der MS Visual Studio 2012: bauen statisch gelinkten exe
Sie kann nicht link DLLs statisch. Eine DLL ist, die strukturiert ist, eine dynamische Verbindung. Ja, statische Bindung wäre der Weg zu gehen, aber Sie benötigen eine statische Bibliothek.
ja, ich meinte den link statisch 🙂
Antwort dort (auf dieser Seite) hat mir nicht helfen. Ich habe bereits diese Schritte (zur Verfügung gestellt von Zaw Lin).
Sie kann nicht link DLLs statisch. Eine DLL ist, die strukturiert ist, eine dynamische Verbindung. Ja, statische Bindung wäre der Weg zu gehen, aber Sie benötigen eine statische Bibliothek.
ja, ich meinte den link statisch 🙂
Antwort dort (auf dieser Seite) hat mir nicht helfen. Ich habe bereits diese Schritte (zur Verfügung gestellt von Zaw Lin).
InformationsquelleAutor Pavlo Zvarych | 2014-05-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
DLLs selbst kann nicht "statisch" in eine ausführbare Datei; komplett trotzt Ihren Zweck (gut, eigentlich können Sie einige wirklich seltsame voodoo-tricks, die es wirklich tun, aber das ist weder empfehlenswert, noch sollten Sie es versuchen, wenn Sie sich diese Frage stellen).
Wäre die einfachste Lösung, um die Identifizierung aller DLLs, die Ihr Programm benötigt (nur das starten des Programms im Debugger generiert eine log-Datei aufgelistet Ihnen allen) und kopieren Sie diese DLLs in das selbe Verzeichnis wie die EXE befindet, wie es geschieht, das Verzeichnis mit der EXE-Datei in das erste Verzeichnis, in dem das system sieht für DLLs vor der Förderung auf die Haltung-system directoris in der Standardkonfiguration. Paket, und verteilen Sie es auf diese Weise.
Geben eine grobe Zusammenfassung. Die Schritte, die beteiligt sein würde, ein Werkzeug zu verwenden, ähnlich objcopy (vielleicht können Sie sogar mit objcopy) oder objdump zu "entkoppeln" die DLL/shared object in einfachen Objekt-Dateien. Aber DLLs/shared objects haben Einstiegspunkte
DllMain
/_init/_fini
sind aufgerufen, eine Besondere Zeit. Auch ein paar spezielle Abschnitte für die symbol-Ort-übersetzung. Windows-DLLs Genehmigung für die Interprozesskommunikation shared memory Abschnitte. etc. etc. Letztlich hätten Sie sich aufgeteilt, alles in Objekte und verknüpfen Sie als statische Bibliothek.Eine andere Methode ist, einfach einbetten, das ganze DLL/shared object, wie es ist, die als blob in die ausführbare Datei. Beim Programmstart, dass ein Teil der ausführbaren Datei konnte zugeordnet werden, wie eine virtuelle Datei / Datei anzeigen und an den dynamischen linker als solche.
Und noch eine andere Methode wäre die Implementierung eines benutzerdefinierten dynamischen linker in die ausführbare Datei, und lassen Sie, dass die Arbeit mit der binary-blob von einer eingebetteten DLL/shared object direkt. – Außer für das entkoppeln/relink Weg, die beiden anderen Methoden sind geradezu beängstigend (meist aus Sicherheitsgründen).
Falsch. Blick auf dieses stackoverflow.com/questions/26103966/...
InformationsquelleAutor datenwolf
die kompliziertere Lösung wäre, zu bauen statische opencv-Bibliotheken, die aus src, dann verknüpfen Sie Ihr Programm gegen diejenigen, die, was in 1 großen binäre exe-chunk, der nicht alle dlls (abgesehen von ffmpeg, nicht sicher).
bauen statische libs, würden Sie brauchen, um cmake mit : BUILD_SHARED_LIBS=OFF
aber nehmen Sie einen tiefen Atemzug, bevor dies zu tun. verknüpfen Sie Ihr Programm, werden sigificantly schwieriger, denn jetzt müssen Sie alle die zlib,libpng, was Abhängigkeiten manuell ( was vor hab komfortabel mit in Ihre dlls )
wieder, die einfachste Lösung ist das bereitstellen aller die opencv-dlls mit Ihrem Programm.
InformationsquelleAutor berak
Können Sie die Windows Dependency Walker, um festzustellen, welche DLLs dein Programm ausgeführt werden muss.
Eigentlich nur erzählt, welche DLLs dein Programm braucht, erfolgreich zu starten. Wenn Sie das laden von DLLs dynamisch über LoadLibrary), dann sind Sie auf Ihre eigenen.
InformationsquelleAutor Ferruccio
Wenn Sie sich für die akzeptierte Lösung (Paket die Dll mit der EXE-Datei), und Sie wollen nicht zu gehen in die Schwierigkeiten zu finden, welche DLLs zu verwenden, dann können Sie kopieren Sie alle OpenCV-DLLs. Sie sind nicht so groß (65 MB auf OpenCV 2.43). Sie befinden sich in
...\opencvXXX\build\x64\vc10\bin\
wo
XXX
ist die OpenCV-version. Sie könnenx64
oderx86
je nach Plattform (32-oder 64-bit). Und die version vonvc
kann in Ihrem system anders sein (vc9
,vc10
, etc...)InformationsquelleAutor Hazem