Impossibile avviare il programma perché manca libgcc_s_dw2-1.dll


166

Ho creato un semplice programma in C ++ con Code :: Blocks.

Se lo eseguo da Code :: Blocks, funziona correttamente; ma se lo eseguo facendo doppio clic sul file eseguibile, viene visualizzato un messaggio con questo messaggio:

Impossibile avviare il programma perché libgcc_s_dw2-1.dll non è presente sul tuo computer.
Prova a reinstallare il programma per risolvere questo problema.

Quindi qual'è il problema? Cosa devo fare per risolverlo?

Risposte:


196

Credo che questo sia un problema del compilatore MinGW / gcc, piuttosto che un'installazione di Microsoft Visual Studio.

L' libgcc_s_dw2-1.dlldovrebbe essere nella directory bin del compilatore. È possibile aggiungere questa directory alla variabile di ambiente PATH per il collegamento in runtime oppure è possibile evitare il problema aggiungendo "-static-libgcc -static-libstdc ++" ai flag del compilatore.

Se si prevede di distribuire il file eseguibile, quest'ultimo probabilmente ha più senso. Se si prevede di eseguirlo solo sul proprio computer, la modifica della variabile di ambiente PATH è un'opzione interessante (mantiene le dimensioni dell'eseguibile).

aggiornato:

Sulla base del feedback di Greg Treleaven (vedi commenti sotto), sto aggiungendo collegamenti a:

[Screenshot del codice :: Blocchi "Opzioni di costruzione del progetto"]

[Opzioni GNU gcc link]

Quest'ultima discussione include -static-libgcce -static-libstdc++opzioni di linker.


Ho lo stesso problema di @xRobot e non sono riuscito a trovare un posto dove aggiungere elementi ai flag del compilatore, quindi ho provato ad aggiungerlo ad altre opzioni, quindi a Opzioni linker e il messaggio di errore continuava a verificarsi. C'è qualcosa di sbagliato in quello che sto facendo?
Greg Treleaven,

@Greg Treleaven: Solo per chiarezza, stai costruendo un eseguibile con Code :: Block, funziona come previsto all'interno dell'IDE ma segnala un errore "impossibile avviare perché manca libgcc_s_dw2-1.dll" quando si tenta di eseguirlo fuori dall'IDE. Hai controllato la directory bin del compilatore e sì, questa DLL è effettivamente lì. Si sta tentando di risolvere il problema eseguendo un collegamento statico, che estrae il codice compilato da una libreria in modo che la DLL (collegamento di runtime) non sia necessaria, ma non funziona. Due suggerimenti: fai una build pulita (la modifica delle opzioni potrebbe non innescare una ricostruzione) e prova ad aggiungere la variabile PATH.
Hardmath,

@hardmath: dopo aver fatto una ricostruzione pulita non funziona ancora, quindi credo che dovrò usare uno degli altri modi per risolvere questo problema. Grazie dell'aiuto.
Greg Treleaven,

@Greg Treleaven: il motivo per provare ad aggiungere la directory bin del compilatore al PATH è mostrare (se ciò fa funzionare le cose) che l'eseguibile è ancora in costruzione per il collegamento runtime delle librerie standard (DLL). Sto pensando che il problema sia questo e dobbiamo trovare (se si desidera eseguire un collegamento statico del codice della libreria) dove posizionare i flag del compilatore.
Hardmath,

4
Questa discussione continua (ed è risolta) qui .
David C

37

In Eclipse, lo troverai nelle proprietà del progetto> C / C ++ Build> Impostazioni> MinGW C ++ Linker> Varie

Devi aggiungerlo ai "flag linker" in alto; da nessun altra parte. Quindi ricostruisci.

Schermata delle proprietà di Eclipse

Ho scoperto che collegando quelli esplode staticamente la dimensione fino a 1.400kb anche con ottimizzazioni. È 277kb più grande rispetto alla sola copia sulle DLL condivise. È anche più grande di 388kb dopo UPXing tutto. Molto perdere / perdere qui. Includere semplicemente le DLL poiché l'utente finale può decidere di eliminarle o meno se le hanno installate altrove.


1
C'è un modo per evitare di aggiungere il flag linker in ogni progetto appena creato?
Roger Ng,

Ai lettori: si prega di notare le opzioni aggiunte nell'immagine. Questo funziona Questo aiuta come riferimento: orfe.princeton.edu/help/article-296
PALEN

10

Codice :: Blocchi: aggiungi '-static' in settings-> compilatore-> Impostazioni linker-> Altre opzioni di linker.


1
Questo ha funzionato perfettamente per me per quanto riguarda la DLL "mancante" per il titolo, è così semplice e veloce, consiglierei di provare prima questo.
Paul Connolly,

Soluzione migliore !
iyy0v,

6

Trova quella dll sul tuo PC e copiala nella stessa directory in cui si trova il tuo eseguibile.


perché questo non accade con Visual Studio?
xRobot,

1
Lo fa anche, ma con altre DLL. Esempi, se manchi msvcrt90.dll, il tuo progetto compilato visivamente non si avvierà (comunque il sistema è solitamente installato a livello di sistema)
Bruce,

6

Vedi anche . Ha risolto il mio problema.

A proposito, è sicuramente compilerbandiera? Forse linkerè il termine più adatto qui?


1
+1 per terminazione corretta! Sì, il mio "collegamento" alle opzioni di collegamento di gcc era un indizio di ciò (per le librerie statiche).
Hardmath,

5

Copia "libgcc_s_dw2-1.dll" in dove make.exe è. (Se si utilizza Msys, copiarlo in \ msys \ bin) Assicurarsi che il percorso di make.exe sia impostato in env. PERCORSO (se make.exe si trova in una cartella "bin", molto probabilmente, e hai msys, è \ msys \ bin) Compila, esegui, debug, ecc. Felice.


5

Vai all'albero di MinGW http sourceforge.net. Sotto Home / MinGW / Base / gcc / Version4 (o qualunque sia la versione utilizzata) / gcc-4 (versione) / troverai un file come gcc-core-4.8.1-4-mingw32-dll.tar.lzma . Estrai e vai nella cartella bin dove troverai libgcc_s_dw2-1.dll e altre DLL. Copia e incolla ciò di cui hai bisogno nella tua cartella bin.


5

Sono stato in grado di superare questo usando "gcc" invece di "g ++" per il mio compilatore. So che questa non è un'opzione per la maggior parte delle persone, ma ho pensato di menzionarla come un'opzione alternativa :)


4

Non riesci a metterlo in system32 o qualcosa di simile a te con altri file dll, in modo che ogni programma che provi a eseguire non abbia quel problema sul tuo computer?

Ho solo bisogno del percorso dove metterlo.

È un po 'fastidioso metterlo nella directory ogni volta che eseguo un programma che ho appena creato ...

Modifica: ho trovato la soluzione:

Estrai libgcc_s_dw2-1.dll in un percorso sul tuo computer. Ti consigliamo di decomprimerlo nella directory del programma che richiede libgcc_s_dw2-1.dll.

Se non funziona, dovrai estrarre libgcc_s_dw2-1.dll nella tua directory di sistema. Per impostazione predefinita, questo è:

  • C: \ Windows \ System (Windows 95/98 / Me)
  • C: \ WINNT \ System32 (Windows NT / 2000)
  • C: \ Windows \ System32 (Windows XP, Vista, 7)

Se usi una versione a 64 bit di Windows, dovresti anche inserire libgcc_s_dw2-1.dll in C: \ Windows \ SysWOW64 \

Assicurati di sovrascrivere tutti i file esistenti (ma crea una copia di backup del file originale). Riavvia il tuo computer.

Se il problema persiste, provare quanto segue:

  • Apri il menu Start di Windows e seleziona "Esegui ...".
  • Digitare CMD e premere Invio (o se si utilizza Windows ME, digitare COMANDO).
  • Digita regsvr32 libgcc_s_dw2-1.dll e premi Invio.

12
Si prega di non pubblicare commenti come risposte qui. Non è così che Stack Overflow funziona. Inoltre non andrai lontano usando "u" invece di "tu" e "cos" invece di "because". Qui la chat non è specificatamente vietata.
meagar

4

Basta andare su Impostazioni >> Compilatore e debugger, quindi fare clic sulla scheda Impostazioni del linker e passare al controllo di modifica "Altre opzioni di linker" e incollare: "-static-libgcc -static-libstdc ++" su di esso, non esiste alcuna opzione flag del compilatore nelle opzioni Flag del compilatore per Code :: Blocks, quindi questo è il modo di risolvere quel problema, sono venuto qui alla ricerca di una soluzione e l'unico che ha pubblicato "-static-libgcc -static-libstdc ++" mi ha dato l'idea giusta, e Ho capito per caso il resto, ma ha funzionato, il file è ora cliccabile dall'esterno di Code :: Blocks, funziona direttamente dal desktop.


3

Aggiungi il percorso a quella dll nella variabile d'ambiente PATH.


perché questo non accade con Visual Studio?
xRobot,

Probabilmente perché il percorso per quella dll è elencato in Strumenti di VisualStudio-> Opzioni-> Progetti e soluzioni -> Directory VC ++ -> File eseguibili. Visual Studio guarda qui e nella variabile d'ambiente PATH durante la ricerca di percorsi per DLL.
Bojan Komazec,

2

Includere -static-libgcc nella riga di compilazione, risolve il problema

g++ my.cpp -o my.exe -static-libgcc

Secondo: @hardmath

Puoi anche creare un alias sul tuo profilo [.profile] se ad esempio sei su MSYS2

alias g++="g++ -static-libgcc"

Ora passa anche il tuo comando GCC ;-)

Ricorda di riavviare il tuo Terminale


1

Aggiungi "-static" ad altre opzioni del linker risolve questo problema. Stavo avendo lo stesso problema dopo averlo testato su un altro sistema, ma non da solo, quindi anche se non lo hai notato sul tuo sistema di sviluppo, dovresti verificare di avere questo set se stai collegando staticamente.

Un'altra nota, copiare la DLL nella stessa cartella dell'eseguibile non è una soluzione in quanto sconfigge l'idea del collegamento statico.

Un'altra opzione è quella di utilizzare la versione TDM di MinGW che risolve questo problema.

Modifica aggiornamento: questo potrebbe non risolvere il problema per tutti. Un altro motivo che ho scoperto di recente per questo è quando si utilizza una libreria compilata da qualcun altro, nel mio caso era SFML che è stato compilato in modo errato e quindi richiedeva una DLL che non esisteva in quanto è stata compilata con una versione diversa di MinGW rispetto a quella che ho uso. Uso una build nana, questa ne utilizzava un'altra, quindi non avevo la DLL da nessuna parte e ovviamente non la volevo perché era una build statica. La soluzione potrebbe essere quella di trovare un'altra build della libreria o crearla da soli.


0

Lavorando con msys2 ho ottenuto lo stesso errore nel tentativo di eseguire la versione di rilascio del mio progetto in un ambiente di debug. La soluzione al mio problema è ovvia: utilizzare eseguibile con simboli di debug.


0

In CodeBlocks puoi andare su Impostazioni ... Compilatore ... e scegliere 1) i due elementi nella casella blu o 2) l'unico elemento nella casella verde

codeblocks impostazioni del compilatore


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.