O programa não pode ser iniciado porque está faltando libgcc_s_dw2-1.dll

166

Eu criei um programa simples em C ++ com Code :: Blocks.

Se eu executá-lo no Code :: Blocks, ele funcionará corretamente; mas se eu executá-lo clicando duas vezes no arquivo executável, uma janela é exibida com esta mensagem:

O programa não pode ser iniciado porque está faltando libgcc_s_dw2-1.dll no seu computador.
Tente reinstalar o programa para resolver este problema.

Então qual é o problema? O que preciso fazer para corrigi-lo?

xRobot
fonte

Respostas:

196

Acredito que este seja um problema do compilador MinGW / gcc, em vez de uma instalação do Microsoft Visual Studio.

O libgcc_s_dw2-1.dlldeve estar no diretório bin do compilador. Você pode adicionar esse diretório à variável de ambiente PATH para vincular o tempo de execução ou evitar o problema adicionando "-static-libgcc -static-libstdc ++" aos sinalizadores do compilador.

Se você planeja distribuir o executável, o último provavelmente faz mais sentido. Se você planeja executá-lo apenas em sua própria máquina, a alteração da variável de ambiente PATH é uma opção atraente (reduz o tamanho do executável).

Atualizada:

Com base nos comentários de Greg Treleaven (veja os comentários abaixo), estou adicionando links para:

[Captura de tela do Code :: Blocks "Project build options"]

[Opções de link GNU gcc]

A última discussão inclui -static-libgcce -static-libstdc++opções de vinculador.

hardmath
fonte
Eu tenho o mesmo problema que o @xRobot e não consegui encontrar nenhum lugar para adicionar itens aos sinalizadores do compilador, então tentei adicioná-lo a Outras Opções, Opções do Vinculador e a mensagem de erro ainda ocorreu. Há algo de errado com o que estou fazendo?
Greg Treleaven
@ Greg Treleaven: Apenas para maior clareza, você está construindo um executável com o Code :: Block, ele funciona como esperado dentro do IDE, mas relata um erro "não pode ser iniciado porque está faltando libgcc_s_dw2-1.dll" ao tentar executá-lo fora do IDE. Você verificou o diretório bin do compilador e, sim, essa DLL está lá. Você está tentando corrigir o problema fazendo uma ligação estática, que extrai o código compilado de uma biblioteca para que a DLL (ligação de tempo de execução) não seja necessária, mas não está funcionando. Duas sugestões: Faça uma construção limpa (alterar as opções pode não acionar uma reconstrução) e tente adicionar a variável PATH.
hardmath
@hardmath: Ainda não está funcionando depois de fazer uma reconstrução limpa, então acho que vou ter que usar uma das outras maneiras de corrigir isso. Obrigado por ajudar.
Greg Treleaven
@ Greg Treleaven: O motivo para tentar adicionar o diretório bin do compilador ao PATH é mostrar (se isso faz as coisas funcionarem) que o executável ainda está sendo construído para a ligação em tempo de execução das bibliotecas padrão (DLLs). Estou pensando que o problema é esse e precisamos encontrar (se você quiser fazer ligação estática do código da biblioteca) onde colocar os sinalizadores do compilador.
hardmath
4
Esta discussão continua (e está resolvida) aqui .
David C
37

No Eclipse, você o encontrará nas propriedades do projeto> Compilação C / C ++> Configurações> Vinculador MinGW C ++> Misc

Você deve adicioná-lo aos "sinalizadores do vinculador" na parte superior; em nenhum outro lugar. Então apenas reconstrua.

Captura de tela de propriedades do Eclipse

Descobri que vincular estaticamente explode o tamanho até 1.400kb, mesmo com otimizações. É 277kb maior em comparação com apenas copiar as DLLs compartilhadas. Também é 388kb maior depois de atualizar tudo. Muito perder / perder aqui. Basta incluir as DLLs, pois o usuário final pode decidir excluí-las ou não, caso as tenha instalado em outro local.

TommyTom
fonte
1
Existe uma maneira de evitar adicionar o sinalizador vinculador em cada projeto recém-criado?
Roger Ng
Para os leitores: Observe as opções adicionadas na imagem. Isso funciona. Isso ajuda como referência: orfe.princeton.edu/help/article-296
PALEN
10

Code :: Blocks: adicione '-static' em settings-> compiler-> Linker settings-> Other linker options.

user1826947
fonte
1
Isso funcionou perfeitamente para mim em relação à dll "ausente" do título, é tão rápido e fácil que eu recomendaria tentar esta primeira.
Paul Connolly
Melhor solução !
iyy0v 26/04
6

Encontre essa dll no seu PC e copie-a no mesmo diretório em que o seu executável está.

Dave
fonte
por que isso não acontece com o visual studio?
XRobot
1
Ele também faz, mas com outras DLLs. Exemplos, se você não tiver msvcrt90.dll, seu projeto compilado visuais não iniciará (IUT é todo o sistema que normalmente instalado)
Bruce
6

Veja também . Isso resolveu meu problema.

A propósito, é definitivamente compilerbandeira? Talvez linkerseja o termo mais adequado aqui?

gordura
fonte
1
+1 para terminologia correta! Sim, meu "link" para as opções de link do gcc era uma idéia disso (para as bibliotecas estáticas).
hardmath
5

Copie "libgcc_s_dw2-1.dll" para o make.exe. (Se você estiver usando o Msys, copie-o para \ msys \ bin) Verifique se o caminho para make.exe está definido no ambiente. CAMINHO (se make.exe estiver em uma pasta "bin", provavelmente e você tiver msys, é \ msys \ bin) Compile, rund, depure etc. feliz.

Blizz
fonte
5

Vá para a árvore http MinforW sourceforge.net. Em Home / MinGW / Base / gcc / Version4 (ou qualquer outra versão que o uso esteja usando) / gcc-4 (versão) / você encontrará um arquivo como gcc-core-4.8.1-4-mingw32-dll.tar.lzma . Extraia-o e vá para a pasta bin, onde você encontrará sua libgcc_s_dw2-1.dll e outras DLLs. Copie e cole o que você precisa no diretório bin.


fonte
5

Consegui superar isso usando "gcc" em vez de "g ++" no meu compilador. Eu sei que isso não é uma opção para a maioria das pessoas, mas pensei em mencioná-lo como uma opção alternativa :)

rogerdpack
fonte
4

Você não pode colocá-lo no system32 ou algo parecido com o que acontece com outros arquivos DLL, para que todo programa que você tenta executar não tenha esse problema na sua máquina?

Eu só preciso do caminho onde colocá-lo.

É meio chato colocá-lo no diretório toda vez que executo um programa que acabei de criar ...

Edit: Encontrei a solução:

Extraia o libgcc_s_dw2-1.dll para um local no seu computador. Recomendamos descompactá-lo para o diretório do programa que está solicitando a libgcc_s_dw2-1.dll.

Se isso não funcionar, você precisará extrair a libgcc_s_dw2-1.dll para o diretório do sistema. Por padrão, isso é:

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

Se você usa uma versão de 64 bits do Windows, também deve colocar libgcc_s_dw2-1.dll em C: \ Windows \ SysWOW64 \

Certifique-se de substituir os arquivos existentes (mas faça uma cópia de backup do arquivo original). Reinicie o computador.

Se o problema persistir, tente o seguinte:

  • Abra o menu Iniciar do Windows e selecione "Executar ...".
  • Digite CMD e pressione Enter (ou se você usa o Windows ME, digite COMMAND)).
  • Digite regsvr32 libgcc_s_dw2-1.dll e pressione Enter.
yossi
fonte
12
Por favor, não poste comentários como respostas aqui. Não é assim que o Stack Overflow funciona. Você também não vai longe usando "u" em vez de "você" e "cos" em vez de "porque". A conversação por bate-papo é especificamente proibida aqui.
meagar
4

Vá para Configurações >> Compilador e Depurador, clique na guia Configurações do vinculador e vá para o controle de edição "Outras opções do vinculador" e cole: "-static-libgcc -static-libstdc ++", não há opção de sinalizador do compilador nas opções de sinalizadores do compilador para Code :: Blocks, então esse é o caminho para resolver esse problema. Eu também vim aqui procurando uma solução e o cara que postou sobre "-static-libgcc -static-libstdc ++" deu a idéia certa e Eu meio que descobri o resto por acidente, mas funcionou, o arquivo é clicável agora de fora do Code :: Blocks, funciona diretamente da área de trabalho.

Jack Offington
fonte
3

Adicione o caminho para essa dll na variável de ambiente PATH.

Bojan Komazec
fonte
por que isso não acontece com o visual studio?
XRobot
Provavelmente porque o caminho para essa dll está listado em Ferramentas do VisualStudio -> Opções -> Projetos e soluções -> Diretórios VC ++ -> Arquivos executáveis. O Visual Studio procura aqui e na variável de ambiente PATH ao procurar caminhos para dlls.
Bojan Komazec
2

A inclusão de -static-libgcc na linha de compilação resolve o problema

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

De acordo com: @hardmath

Você também pode criar um alias no seu perfil [.profile] se estiver no MSYS2, por exemplo

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

Agora seu comando do GCC também passa ;-)

Lembre-se de reiniciar o seu Terminal

PYK
fonte
1

Adicionar "-static" a outras opções do vinculador resolve esse problema. Eu estava tendo o mesmo problema depois que testei isso em outro sistema, mas não por conta própria; portanto, mesmo que você não tenha notado isso em seu sistema de desenvolvimento, verifique se você tem esse conjunto se estiver vinculando estaticamente.

Outra observação: copiar a DLL para a mesma pasta que o executável não é uma solução, pois derrota a idéia de vincular estaticamente.

Outra opção é usar a versão TDM do MinGW que resolve esse problema.

Atualizar edição: isso pode não resolver o problema para todos. Outra razão que descobri recentemente é que quando você usa uma biblioteca compilada por outra pessoa, no meu caso, foi SFML que foi compilada incorretamente e exigiu uma DLL que não existia, pois foi compilada com uma versão diferente do MinGW do que eu usar. Eu uso uma compilação anã, esta usou outra, então eu não tinha a DLL em lugar algum e, é claro, eu não a queria, pois era uma compilação estática. A solução pode ser encontrar outra compilação da biblioteca ou criar você mesmo.

Neil Roy
fonte
0

Trabalhando com o msys2, obtive o mesmo erro ao tentar executar a versão do meu projeto em um ambiente de depuração. A solução para o meu problema é óbvia: use executável com símbolos de depuração.

Rubén Pozo
fonte
0

No CodeBlocks, você pode acessar Configurações ... Compilador ... e escolher 1) os dois itens na caixa azul ou 2) o item na caixa verde

configurações do compilador de codeblocks

raddevus
fonte