Come posso eliminare i problemi di "DLL mancante"?


15

Ho realizzato alcuni giochi con Visual C ++ 2015 e OpenGL. Quando l'ho eseguito sul mio computer non c'erano problemi, ma quando l'ho eseguito su altri computer mostra che mancano alcune DLL. Voglio sapere come fare in modo che non accada la prossima volta e quali cose dovrei considerare in modo da evitare problemi di file mancanti?


8
Innanzitutto, assicurati di creare una versione di rilascio.
user253751

3
Se vuoi essere assolutamente sicuro che non ci siano dipendenze da VS stesso - ma ha il suo svantaggio - nelle impostazioni di generazione del codice puoi scegliere di andare con Debug multi-thread / multi-thread (per build di debug) invece di MT DLL / DLL di debug MT . Aumenta le dimensioni del tuo eseguibile e il tuo file binario compilato in questo modo non beneficerà degli aggiornamenti di runtime dlls. Ma dipende da te. Il lato positivo è che il tuo eseguibile non avrà dipendenze "esterne". Non pubblicherò questo come una risposta perché questa non è una soluzione al tuo problema, solo una soluzione alternativa.
Gizmo

@Gizmo una soluzione alternativa è ancora una risposta e i commenti sono temporanei e utilizzati per chiarire i post in cui si trovano e possono essere eliminati. Quindi, se è utile, dovresti pubblicarlo come risposta.
user1306322

Va bene. Lo posterò come risposta allora.
Gizmo

Risposte:


22

È necessario installare i ridistribuibili per la versione di Visual Studio utilizzata su qualsiasi macchina che desideri eseguire gli eseguibili, ad esempio https://www.microsoft.com/en-us/download/details.aspx?id=48145 per VS2015 . Potresti anche aver bisogno di redist per DirectX o altri componenti.

Gli installatori di applicazioni generalmente installano tutti i ridistribuibili per una qualsiasi delle loro dipendenze. È possibile creare un programma di installazione di questo tipo con InnoSetup, NSIS, WIX o vari altri strumenti.

È possibile creare file eseguibili che non necessitano di ridistribuibili, ma si è quindi limitati a un sottoinsieme delle funzionalità di Windows di base, che generalmente non sono sufficienti per creare qualsiasi tipo di gioco significativo o applicazione di grandi dimensioni. Gli stessi installatori sono un esempio di applicazioni che non necessitano di dipendenze per l'esecuzione.


È possibile utilizzare VS per creare un tale programma di installazione? Pensavo di aver visto qualcosa chiamato OneClick nelle impostazioni del progetto una volta.
user1306322

@ user1306322: assolutamente, una soluzione è stata menzionata nei commenti della domanda da Gizmo. È solo una questione di runtime / DLL a cui ti colleghi. Le impostazioni predefinite prevedono il collegamento con la DLL CRT specifica della versione, ma che può essere modificata inserendo le opzioni del linker. Basta collegare MSVCRT.DLL(incluso con Windows stesso) anziché MSVCPxxx.DLL(versioni specifiche della versione incluse con le versioni di Visual Studio).
Sean Middleditch

O se intendi costruire un programma di installazione completo, questo è fondamentalmente ciò che WIX è. È un tipico crapfest Microsoft pesantemente complicato da XML, ma funziona. C'erano anche "progetti di installazione" anche se credo che siano spariti dal 2013 o 2015.
Sean Middleditch

7

Uso Dependency Walker per rintracciare le DLL mancanti:

Dependency Walker è anche molto utile per la risoluzione di errori di sistema relativi al caricamento e all'esecuzione dei moduli. Dependency Walker rileva molti problemi applicativi comuni come moduli mancanti, moduli non validi, mancata corrispondenza di importazione / esportazione, errori di dipendenza circolare, tipi di moduli macchina non corrispondenti e errori di inizializzazione del modulo.


Esiste anche un'opzione di compilazione in VS per collegare staticamente le DLL:

  • Il collegamento statico significa che le DLL sono incluse nel file EXE.
  • Il collegamento statico aumenta la dimensione del file EXE.
  • Il collegamento statico significa che questa versione della DLL verrà sempre utilizzata.
  • Tuttavia, il collegamento statico significa anche che non avrai mai problemi con le DLL mancanti.

1
Il camminatore delle dipendenze è piuttosto vecchio. Non emula più correttamente i meccanismi di Windows per il caricamento di DLL. Spesso porta a messaggi fasulli sull'impossibilità di trovare DLL.
jpmc26

E il collegamento statico può essere vietato nella licenza di una dipendenza.
KeyWeeUsr

6

Per Visual C ++, hai alcune scelte su come gestire la ridistribuzione: esegui un EXE dal tuo programma di installazione (con diritti di amministratore), usa un modulo di unione MSM con il tuo programma di installazione MSI o persino DLL side-by-side. Vedi MSDN per i dettagli.

Il problema più grande è OpenGL. L'unica versione di OpenGL inclusa in Windows è un renderer software OpenGL 1.5. Qualsiasi altra cosa richiede l'installazione di un ICD di terze parti.

Questo è uno dei motivi per cui così tanti giochi per Windows usano DirectX invece poiché è incluso nel sistema operativo. Vedi la distribuzione di Direct3D 11 per gli sviluppatori di giochi e l' installazione non così diretta .


1
Il consiglio OpenGL è obsoleto: ogni moderno driver grafico è dotato di un ICD OpenGL aggiornato.
user253751

Personalmente ho dovuto installare DLL openGL su macchine di appena un anno
Gnemlock

@Gnemlock Immediatamente dopo aver reinstallato Windows su quel vecchio computer, potresti avere ragione. Hai continuato a riscontrare questo problema dopo aver installato il pacchetto driver ufficiale da NVIDIA, AMD o Intel?
Damian Yerrick,

2
@Gnemlock - se stai installando manualmente DLL OpenGL, stai facendo qualcosa di orribilmente sbagliato. Se in realtà intendi "installare il driver del tuo fornitore di GPU", questo è esattamente ciò che ha detto anche Immibis.
Maximus Minimus

@Gnemlock - ah, quindi non è rilevante per il mondo reale allora. Grazie per averlo chiarito.
Maximus Minimus

1

Disclaimer: questa è una soluzione alternativa , non una soluzione alla tua risposta, ma comunque una possibilità molto praticabile.

Se vuoi essere assolutamente sicuro che non ci siano dipendenze da VS stesso - ma ha i suoi svantaggi - nelle impostazioni di generazione del codice puoi scegliere di andare con Multi Threaded (MT) / Multi Threaded Debug (MD) (per build di debug ) anziché MT DLL (MTd) / MT Debug DLL (MDd).

inserisci qui la descrizione dell'immagine

Quali sono gli svantaggi?

  • Aumenta le dimensioni del tuo eseguibile e il tuo binario (anche se se stai facendo un gioco questo è probabilmente trascurabile)
  • compilato in questo modo non trarrà vantaggio dagli aggiornamenti delle dll di runtime. (ad es. se Microsoft rilascia VC ++ 2015 SP2, SP3, SP4 ecc.) Ma dipende da te.
  • Più utilizzo della RAM (anche trascurabile) perché non riutilizzi il codice esistente / caricato (DLL)
  • Devi assicurarti che tutte le librerie che colleghi siano compilate sullo stesso runtime, altrimenti il ​​collegamento potrebbe non riuscire o potrebbero verificarsi interessanti errori di runtime (probabilmente no, ma è successo a me una volta nella vita in un progetto legacy a cui è stato aggiornato l'ultimo VS)

E quali sono i professionisti?

  • il tuo eseguibile non avrà dipendenze "esterne" da VS stesso (nessun requisito msvc * .dll).
  • alcune persone vedono questo come un aumento delle prestazioni perché si sta eliminando l'overhead delle chiamate DLL, mentre ciò è teoricamente vero, i miglioramenti sono trascurabili nella pratica

Controlla questo link per una spiegazione più elaborata e per i guasti e le cadute che potresti incontrare utilizzando un runtime statico.

Un'altra soluzione alternativa sarebbe quella di mettere tutte le DLL richieste dove si trova il tuo binario. La tua applicazione non beneficerà degli aggiornamenti (alle librerie di runtime) ma il gioco è fatto.

La vera soluzione è quella di distribuire l'applicazione in modalità release / non debug dll (MTd) e fornire il programma di installazione ridistribuibile VC ++ corretto (e tutti gli altri programmi di installazione di librerie che è possibile utilizzare, ad esempio OpenAL, DirectX9, PhysX) e consentire all'utente di eseguirlo prima di eseguire l'applicazione (come indicato da altre risposte).

Assicurati inoltre di far sapere all'utente che potrebbe aver bisogno di aggiornare i suoi driver GPU (poiché quelli contengono più runtime anche per molte applicazioni, ad esempio OpenGL, Vulcan).


0

La mia soluzione era di copiare e incollare la DLL che ha causato l'errore nella cartella in cui si trova il file .sln in Visual Studio. Dopo la #includesezione, l'ho scritto #pragma comment (lib, "lost DLL name with .dll")e risolto!

Nota: ho risolto il problema riscontrato con una libreria DLL (vulkan api) di terze parti. Forse non è noto ma il 90% funzionerà in buona fortuna :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.