Wie kann ich "fehlende DLL" -Probleme beseitigen?

15

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?

Ankit singh kushwah
quelle
8
Stellen Sie zunächst sicher, dass Sie eine Release-Version erstellen.
user253751
3
Wenn Sie absolut sicher sein möchten, dass es keine Abhängigkeiten von VS selbst gibt - dies hat jedoch einen eigenen Nachteil -, können Sie in den Codegenerierungseinstellungen Multi-Threaded / Multi-Threaded-Debug (für Debug-Builds) anstelle von MT- DLL / wählen. MT Debug DLL . Es vergrößert Ihre ausführbare Datei und Ihre auf diese Weise kompilierte Binärdatei profitiert nicht von den Laufzeit-DLLs-Updates. Aber das liegt an dir. Das Plus daran, dass Ihre ausführbare Datei keine "externen" Abhängigkeiten aufweist. Ich werde dies nicht als Antwort posten, da dies keine Lösung für Ihr Problem ist, sondern nur eine Problemumgehung.
Gizmo
@ Gizmo eine Problemumgehung ist immer noch eine Antwort und Kommentare sind temporär und werden verwendet, um die Beiträge zu klären, unter denen sie sind, und können gelöscht werden. Wenn es also nützlich ist, solltest du es als Antwort posten.
user1306322
Hm in Ordnung. Ich werde es dann als Antwort posten.
Gizmo

Antworten:

22

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.

Sean Middleditch
quelle
Ist es möglich, VS zum Erstellen eines solchen Installationsprogramms zu verwenden? Ich dachte, ich habe in den Projekteinstellungen einmal etwas mit dem Namen OneClick gesehen.
user1306322
@ user1306322: Absolut, eine Lösung wurde in den Kommentaren der Frage von Gizmo erwähnt. Es ist nur eine Frage der Laufzeiten / DLLs, mit denen Sie verknüpfen. In den Standardeinstellungen wird eine Verknüpfung mit der versionsspezifischen CRT-DLL hergestellt. Dies kann jedoch durch Ändern der Linkeroptionen geändert werden. Verknüpfen Sie einfach gegen MSVCRT.DLL(in Windows selbst enthalten) anstatt MSVCPxxx.DLL(versionsspezifische Versionen in Visual Studio-Versionen enthalten).
Sean Middleditch
Oder wenn Sie einen kompletten Installer erstellen wollen, dann ist das im Grunde genommen WIX . Es ist ein typisches überkompliziertes XML-schweres Microsoft-Mistfest, aber es funktioniert. Früher gab es auch "Installer-Projekte", obwohl ich glaube, dass diese seit 2013 oder 2015 weg sind.
Sean Middleditch
7

Ich benutze Dependency Walker , um fehlende DLLs aufzuspüren:

Dependency Walker ist auch sehr nützlich für die Fehlerbehebung bei Systemfehlern, die beim Laden und Ausführen von Modulen auftreten. Dependency Walker erkennt viele häufig auftretende Anwendungsprobleme wie fehlende Module, ungültige Module, Import- / Exportfehlanpassungen, zirkuläre Abhängigkeitsfehler, nicht übereinstimmende Maschinentypen von Modulen und Fehler bei der Modulinitialisierung.


Es gibt auch eine Option zum Kompilieren in VS to um DLLs statisch zu verknüpfen :

  • Statische Verknüpfung bedeutet, dass die DLLs in der EXE-Datei enthalten sind.
  • Durch statisches Verknüpfen wird die EXE-Datei vergrößert.
  • Statische Verknüpfung bedeutet, dass diese Version der DLL immer verwendet wird.
  • Statische Verknüpfungen bedeuten jedoch auch, dass Sie niemals ein Problem mit fehlenden DLLs haben werden.
Leftium
quelle
1
Abhängigkeitsläufer ist ziemlich alt. Es emuliert die Windows-Mechanismen zum Laden von DLLs nicht mehr richtig. Dies führt häufig zu falschen Meldungen darüber, dass DLLs nicht gefunden werden können.
jpmc26
Und statische Verknüpfungen können in der Lizenz einer Abhängigkeit verboten sein.
KeyWeeUsr
6

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.

Dies ist einer der Gründe, warum so viele Windows-Spiele DirectX verwenden, da es im Betriebssystem enthalten ist. Siehe Direct3D 11-Bereitstellung für Spieleentwickler und nicht so direktes Setup .

Chuck Walbourn
quelle
1
Der OpenGL-Rat ist veraltet - jeder moderne Grafiktreiber wird mit einem aktuellen OpenGL-ICD ausgeliefert.
user253751
Ich persönlich musste openGL-DLLs auf Computern installieren, die nur ein Jahr alt waren
Gnemlock
@Gnemlock Unmittelbar nach der Neuinstallation von Windows auf diesem einjährigen Computer haben Sie möglicherweise Recht. Wurde dieses Problem nach der Installation des offiziellen Treiberpakets von NVIDIA, AMD oder Intel weiterhin festgestellt?
Damian Yerrick
2
@ Gnemlock - Wenn Sie OpenGL-DLLs manuell installieren, tun Sie etwas Schreckliches falsch. Wenn Sie tatsächlich "Treiber Ihres GPU-Herstellers installieren" meinen, dann ist dies genau das, was immibis gerade gesagt hat.
Maximus Minimus
@ Gnemlock - ah, also nicht relevant für die reale Welt. Danke, dass Sie das geklärt haben.
Maximus Minimus
1

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).

Bildbeschreibung hier eingeben

Was sind die Nachteile?

  • Es vergrößert Ihre ausführbare Datei und Ihre Binärdatei (obwohl dies bei der Erstellung eines Spiels wahrscheinlich vernachlässigbar ist).
  • Auf diese Weise kompilierte DLLs profitieren nicht von den Laufzeit-DLLs-Updates. (zB wenn Microsoft VC ++ 2015 SP2, SP3, SP4 usw. veröffentlicht.) Aber das liegt bei Ihnen.
  • Mehr RAM-Nutzung (auch vernachlässigbar), da Sie vorhandenen / geladenen Code (DLLs) nicht wiederverwenden
  • Sie müssen sicherstellen, dass alle Bibliotheken, die Sie verknüpfen, mit derselben Laufzeit kompiliert werden. Andernfalls kann die Verknüpfung fehlschlagen oder es können interessante Laufzeitfehler auftreten (wahrscheinlich nicht, aber es ist mir einmal im Leben in einem Legacy-Projekt passiert, das auf aktualisiert wurde das neueste VS)

Und was sind die Profis?

  • Ihre ausführbare Datei hat keine "externen" Abhängigkeiten von VS selbst (keine msvc * .dll-Anforderung).
  • Einige Leute sehen dies als eine Leistungssteigerung an, da Sie den DLL-Aufruf-Overhead eliminieren. Dies ist zwar theoretisch der Fall, die Verbesserungen sind jedoch in der Praxis vernachlässigbar

Ü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).

Gizmo
quelle
0

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 #includeAbschnitt 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 :)

user96759
quelle