Ich habe einige Spiele mit Visual C ++ 2015 und OpenGL gemacht. Wenn ich es auf meinem Computer ausführte, gab es kein Problem, aber wenn ich es auf anderen Computern ausführte, zeigt es, dass einige DLLs fehlen. Ich möchte wissen, wie ich sicherstellen kann, dass es das nächste Mal nicht passiert, und welche Dinge sollte ich beachten, damit ich Probleme mit fehlenden Dateien vermeiden kann?
c++
visual-studio
Ankit singh kushwah
quelle
quelle
Antworten:
Sie müssen die Redistributables für die Version von Visual Studio installieren, die Sie auf einem Computer verwendet haben, auf dem die ausführbaren Dateien ausgeführt werden sollen, z. B. https://www.microsoft.com/en-us/download/details.aspx?id=48145 für VS2015 . Möglicherweise benötigen Sie auch Redists für DirectX oder andere Komponenten.
Die Installationsprogramme von Anwendungen installieren im Allgemeinen alle weiterverteilbaren Dateien für eine ihrer Abhängigkeiten. Sie können ein solches Installationsprogramm mit InnoSetup, NSIS, WIX oder verschiedenen anderen Tools erstellen.
Es ist möglich, ausführbare Dateien zu erstellen, für die keine weitervertreibbaren Dateien erforderlich sind, aber Sie sind dann auf eine Teilmenge der Windows-Kernfunktionen beschränkt, die im Allgemeinen nicht ausreicht, um ein bedeutungsvolles Spiel oder eine große Anwendung zu erstellen. Die Installationsprogramme selbst sind ein Beispiel für Anwendungen, für deren Ausführung keine Abhängigkeiten erforderlich sind.
quelle
MSVCRT.DLL
(in Windows selbst enthalten) anstattMSVCPxxx.DLL
(versionsspezifische Versionen in Visual Studio-Versionen enthalten).Ich benutze Dependency Walker , um fehlende DLLs aufzuspüren:
Es gibt auch eine Option zum Kompilieren in VS to um DLLs statisch zu verknüpfen :
quelle
Für Visual C ++ haben Sie einige Möglichkeiten, wie Sie mit der Neuverteilung umgehen können: Führen Sie eine EXE-Datei von Ihrem Installationsprogramm aus (mit Administratorrechten), verwenden Sie ein MSM-Mergemodul mit Ihrem MSI-Installationsprogramm oder sogar parallele DLLs. Sehen Informationen finden MSDN .
Das größere Problem ist OpenGL. Die einzige Version von OpenGL, die in Windows enthalten ist, ist ein OpenGL 1.5-Software-Renderer. Für alles andere muss ein ICD eines Drittanbieters installiert werden.
quelle
Haftungsausschluss: Dies ist eine Problemumgehung , keine Lösung für Ihre Antwort, aber dennoch eine sehr praktikable Möglichkeit.
Wenn Sie absolut sicher sein möchten, dass es keine Abhängigkeiten von VS selbst gibt - diese haben jedoch ihre eigenen Nachteile -, können Sie in den Codegenerierungseinstellungen Multi-Threaded (MT) / Multi-Threaded-Debug (MD) (für Debugbuilds) auswählen ) anstelle von MT DLL (MTd) / MT Debug DLL (MDd).
Was sind die Nachteile?
Und was sind die Profis?
Überprüfen Sie diesen Link für eine ausführlichere Erklärung und für die Fehler, die bei der Verwendung einer statischen Laufzeit auftreten können.
Eine andere Problemumgehung wäre, alle erforderlichen DLLs dort abzulegen, wo sich Ihre Binärdatei befindet. Ihre Anwendung profitiert nicht von Updates (für die Laufzeitbibliotheken), aber das war's.
Die eigentliche Lösung besteht darin, die Anwendung im Release- / Non-Debug-DLL-Modus (MTd) zu verteilen und das richtige VC ++ - weiterverteilbare Installationsprogramm (und alle anderen möglicherweise verwendeten Bibliotheksinstallationsprogramme, z. B. OpenAL, DirectX9, PhysX) bereitzustellen und den Benutzer ausführen zu lassen bevor Sie Ihre Anwendung ausführen (wie andere Antworten gezeigt haben).
Stellen Sie außerdem sicher, dass der Benutzer weiß, dass er / sie möglicherweise seine / ihre GPU-Treiber aktualisieren muss (da diese mehrere Laufzeiten für viele Anwendungen enthalten, z. B. OpenGL, Vulcan).
quelle
Meine Lösung bestand darin, die DLL, die den Fehler verursacht hat, in den Ordner zu kopieren und einzufügen, in dem sich die SLN-Datei in Visual Studio befindet. Nach dem
#include
Abschnitt habe ich es geschrieben#pragma comment (lib, "lost DLL name with .dll")
und gelöst!Hinweis: Ich habe das Problem gelöst, das ich mit einer DLL einer Drittanbieter-Bibliothek (vulkan api) hatte. Vielleicht ist es nicht bekannt, aber 90% funktionieren gut :)
quelle