该程序无法启动,因为缺少libgcc_s_dw2-1.dll


166

我已经用Code :: Blocks在C ++中创建了一个简单的程序。

如果我从Code :: Blocks运行它,它将正常工作;但是如果我通过双击可执行文件来运行它,则会弹出一个窗口,显示以下消息:

该程序无法启动,因为您的计算机缺少libgcc_s_dw2-1.dll。
尝试重新安装该程序以解决此问题。

那么,有什么问题呢?我该怎么做才能解决?

Answers:


196

我相信这是MinGW / gcc编译器问题,而不是Microsoft Visual Studio安装程序。

libgcc_s_dw2-1.dll应在编译器的bin目录。您可以将此目录添加到PATH环境变量中以进行运行时链接,也可以通过在编译器标志中添加“ -static-libgcc -static-libstdc ++”来避免该问题。

如果计划分发可执行文件,则后者可能最有意义。如果仅打算在自己的计算机上运行它,则更改PATH环境变量是一个很吸引人的选择(减小可执行文件的大小)。

更新:

根据格雷格·特雷文(Greg Treleaven)的反馈(请参阅下面的评论),我添加了以下链接:

[Code :: Block的屏幕截图阻止了“项目构建选项”]

[GNU gcc链接选项]

后面的讨论包括-static-libgcc-static-libstdc++链接器选项。


我有与@xRobot相同的问题,并且找不到在编译器标志中添加内容的地方,因此我尝试将其添加到“其他选项”中,然后添加到“链接器选项”中,并且仍然出现错误消息。我的工作有什么问题吗?
格雷格·特雷里文

@Greg Treleaven:为清楚起见,您正在使用Code :: Block构建可执行文件,它在IDE中按预期运行,但是在尝试运行它时报告错误“由于libgcc_s_dw2-1.dll丢失而无法启动”在IDE之外。您检查了编译器的bin目录,是的,此DLL实际上在那里。您正在尝试通过执行静态链接来解决此问题,该链接从库中提取已编译的代码,因此不需要DLL(运行时链接),但是它不起作用。两个建议:做一个干净的构建(更改选项可能不会触发重建),然后尝试添加PATH变量。
hardmath 2011年

@hardmath:经过彻底的重建后仍然无法正常工作,所以我想我必须使用其他方法之一来解决此问题。感谢您的帮助。
格雷格·特雷里文

@Greg Treleaven:尝试将编译器的bin目录添加到PATH的原因是为了表明(如果这样做可以使工作正常)仍在为标准库(DLL)的运行时链接构建可执行文件。我认为问题是这样的,我们需要找到(如果要进行库代码的静态链接)放置编译器标志的位置。
hardmath 2011年

4
该讨论在此处继续(并已解决)。
大卫·C

37

在Eclipse中,您可以在项目属性> C / C ++ Build>设置> MinGW C ++ Linker>其他下找到它

您必须将其添加到顶部的“链接器标志”中。无处。然后重新构建。

Eclipse属性屏幕截图

我发现,即使进行了优化,将这些链接静态链接也可以使最大扩展为1400kb。与仅通过共享DLL复制相比,它大了277kb。UPXing所有内容后,它也增大了388kb。这里很失落。只要将DLL包含在内,最终用户就可以决定是否将其删除(如果它们已在其他位置安装了它们)。


1
有没有一种方法可以避免在每个新创建的项目中添加链接器标志?
罗杰伍

给读者:请注意图像中添加的选项。这可行。这可以作为参考:orfe.princeton.edu/help/article-296
PALEN 2014年

10

代码::块:在设置->编译器->链接器设置->其他链接器选项中添加“ -static”。


1
关于每个标题“缺少”的dll,这对我来说非常有效,它是如此快捷,容易,我建议您先尝试一下。
Paul Connolly

最好的解决方案!
iyy0v

6

在您的PC上找到该dll,然后将其复制到可执行文件所在的目录中。


为什么Visual Studio不会发生这种情况?
xRobot 2011年

1
它也可以,但是带有其他dll。例如,如果您缺少msvcrt90.dll,则您的可视编译项目将不会启动(尽管iut通常在系统范围内安装)
Bruce

6

看到 。它解决了我的问题。

顺便说一句,肯定是compiler旗帜吗?也许linker这里更合适?


1
+1表示正确的术语!是的,我到gcc链接选项的“链接”只是一个暗示(对于静态库)。
hardmath 2011年

5

复制“ libgcc_s_dw2-1.dll”到make.exe。(如果使用的是Msys,请将其复制到\ msys \ bin)确保make.exe的路径已在环境中设置。PATH(如果make.exe最有可能位于文件夹“ bin”中,并且您具有msys,则为\ msys \ bin)编译,运行,调试等。


5

转到MinGW http sourceforge.net树。在Home / MinGW / Base / gcc / Version4(或使用的任何版本)/ gcc-4(version)/下,您会找到一个文件,如gcc-core-4.8.1-4-mingw32-dl​​l.tar.lzma 。将其解压缩并进入bin文件夹,您将在其中找到libgcc_s_dw2-1.dll和其他dll。将所需的内容复制并粘贴到bin目录中。


5

通过为编译器使用“ gcc”而不是“ g ++”,我能够克服这一问题。我知道这不是大多数人的选择,但我想我将其作为解决方法:)


4

您不能将其放在system32或类似的其他dll文件中,以便您尝试运行的每个程序都不会在您的计算机上出现该问题吗?

我只需要放置它的路径。

每当我运行刚构建的程序时,将其放入目录中就有点烦人了。

编辑:我找到了解决方案:

将libgcc_s_dw2-1.dll解压缩到计算机上的某个位置。我们建议您将其解压缩到请求libgcc_s_dw2-1.dll的程序的目录中。

如果这样不起作用,则必须将libgcc_s_dw2-1.dll解压缩到系统目录中。默认情况下,这是:

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

如果使用Windows的64位版本,则还应将libgcc_s_dw2-1.dll放在C:\ Windows \ SysWOW64 \

确保覆盖所有现有文件(但要备份原始文件)。重新启动计算机。

如果问题仍然存在,请尝试以下操作:

  • 打开Windows“开始”菜单,然后选择“运行...”。
  • 键入CMD并按Enter(或者,如果您使用Windows ME,则键入COMMAND)。
  • 键入regsvr32 libgcc_s_dw2-1.dll,然后按Enter。

12
请不要在此处发表评论作为答案。那不是堆栈溢出的工作原理。使用“ u”代替“ you”和使用“ cos”代替“ because”也不会太远。此处特别禁止聊天。
meagar

4

只需转到“设置” >>“编译器和调试器”,然后单击“链接器设置”选项卡,然后转到“其他链接器选项”编辑控件并粘贴:“-static-libgcc -static-libstdc ++”到它,没有编译器标志选项在Code :: Blocks的Compiler Flags选项中,这就是解决该问题的方法,我也来这里寻找解决方案,并且发布了有关“ -static-libgcc -static-libstdc ++”的一个人给出了正确的想法,并且我有点想出了其余的内容,但是它可以正常工作,现在可以从外部Code :: Blocks单击该文件,并且可以直接在桌面上工作。


3

将该dll的路径添加到PATH环境变量中。


为什么Visual Studio不会发生这种情况?
xRobot 2011年

可能是因为在Visual Studio的“工具”->“选项”->“项目和解决方案”->“ VC ++目录”->“可执行文件”中列出了该dll的路径。搜索dll的路径时,Visual Studio在此处和PATH环境变量中查找。
2011年

2

在编译行中包含-static-libgcc可以解决此问题

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

根据:@hardmath

例如,如果您使用的是MSYS2,也可以在配置文件[.profile]上创建别名

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

现在您的GCC命令也可以通过;-)

请记住重启终端


1

将“ -static”添加到其他链接器选项可解决此问题。在另一个系统上进行测试后,我只是遇到了相同的问题,但不是我一个人,所以即使您在开发系统上没有注意到此问题,也应该检查是否已设置了此集合(如果您进行静态链接)。

另请注意,将DLL复制到与可执行文件相同的文件夹中不是解决方案,因为它破坏了静态链接的想法。

另一种选择是使用MinGW的TDM版本来解决此问题。

更新编辑:这可能无法解决所有人的问题。我最近发现的另一个原因是,当您使用别人编译的库时,在我的情况下是SFML,编译不当,因此需要一个不存在的DLL,因为它是用不同于我的MinGW版本编译的用。我使用了一个矮小的构建,这个使用了另一个构建,所以我在任何地方都没有DLL,当然,我也不想要它,因为它是静态构建。解决方案可能是找到该库的另一个版本,或者自己构建。


0

使用msys2时,在调试环境中尝试执行项目的发行版时遇到了相同的错误。我的问题的解决方案很明显:将可执行文件与调试符号一起使用。


0

在CodeBlocks中,您可以转到设置...编译器...,然后选择1)蓝色框中的两个项目或2)绿色框中的一个项目

代码块编译器设置


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.