MinGW .exe需要几个gcc dll而不管代码是什么?

时间:2013-08-09 00:58:14

标签: c++ dll mingw

使用MinGW进行编译时,我必须在exe运行之前从MinGW bin目录复制某些dll文件(即使使用“-static”和/或“-static-libstdc ++”)。 我该如何改变?我必须使用MinGW的特殊版本吗?最终我希望能够运行该程序,只需要在目录中的exe(并且没有设置windows环境变量)。这些文件是:

  • 的libstdc ++ - 6.dll
  • libgcc_s_seh-1.DLL
  • libwinpthread-1.DLL

以下是我休闲的步骤的完整列表:

  1. 打开代码::块
  2. 选择“文件 - >新建 - >项目 - >控制台”
  3. 填写项目“Hello World”的项目设置
  4. 右键单击Project-> Build Options ...-> Hello World(根目标) - >其他选项
  5. 在已设置的“-fexceptions”下输入“-static”(或“-static-libstdc ++”)
  6. CTRL-F9:构建项目(不执行)
  7. 在Windows资源管理器中导航到运行构建的“Hello World.exe”文件。
  8. 当消息弹出“错误:您的计算机缺少libstdc ++ - 6.dll”时,单击“确定”。
  9. 从/ MinGW / bin /目录复制“libstdc ++ - 6.dll”到“Hello World.exe”目录。
  10. 运行“Hello World.exe”
  11. 点击“确定”,显示“错误:您的计算机缺少libgcc_s_seh-1.dll”消息。
  12. 将“libgcc_s_seh-1.dll”复制到“Hello World.exe”目录中。
  13. 重复并最终复制“libwinpthread-1.dll”以及。
  14. 查看消息

    Hello World!
    
  15. 修改 我的命令行是:

    g++.exe -Wall -fexceptions -static -static-libgcc -static-libstdc++ -g -static-libgcc -static-libstdc++ -L. -c "C:\Users\______\Desktop\Hello World\main.cpp" -o obj\Debug\main.o
    g++.exe -o "bin\Debug\Hello World.exe" obj\Debug\main.o
    

    需要上面提到的所有dll文件。并且,为了安全起见,代码是:

    // main.cpp
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        cout << "Hello world!" << endl;
        return 0;
    }
    

4 个答案:

答案 0 :(得分:40)

你的命令错了!

转到 main.cpp 文件所在的目录,然后尝试以下操作。

g++.exe -Wall -c -g main.cpp -o obj\Debug\main.o
g++.exe -static -static-libgcc -static-libstdc++ -o "bin\Debug\Hello World.exe" obj\Debug\main.o

然后您将不再需要复制DLL(用于您的Hello World程序)。

其他说明:

MinGW安装说明建议设置

c:\minGW;c:\MinGW\bin;

到PATH环境变量。

通常是

-static -static-libgcc -static-libstdc++

链接器选项应该有效(一次尝试所有3个)。但不适用于libwinpthread-1.dll

另外,在重新编译之前尝试clean

没有“-static-something”命令。

只能将标准库 libgcc libstdc ++ 设置为静态链接。

对于其他库,首先使用“-static”切换到静态链接,然后列出要包含单独命令的库,即“-lpthread”。

Cmake用户应尝试添加:

set(CMAKE_CXX_STANDARD_LIBRARIES "-static-libgcc -static-libstdc++ -lwsock32 -lws2_32 ${CMAKE_CXX_STANDARD_LIBRARIES}")

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive")

答案 1 :(得分:8)

如果使用例外,

-static-libgcc可能是一个坏主意。 link options documentation表示

  

应用程序应该使用多种情况   共享libgcc而不是静态版本。其中最常见的   当应用程序希望抛出并捕获异常时   不同的共享库。在那种情况下,每个库都为   以及应用程序本身应该使用共享的libgcc。

答案 2 :(得分:0)

人们仍然陷于这个问题,在Code :: Blocks中尝试重建项目。我遇到了同样的问题,但是重建项目有助于解决问题。

答案 3 :(得分:0)

上述答案的注释包含完整的解决方案,因此我只想添加 CodeBlocks 透视图。我在 Windows7 x64 上使用 CodeBlocks16 和 MinGW-W64 8.1.0 ''i686-posix-dwarf'' 验证了它。

这解决了 OP 的问题

  • 创建新项目并将其命名为“Hello World”

  • 接受向导中的所有默认设置

  • 选择 Project/BuildOptions/ 并选择“Hello World”。 Out 编辑对 Debug 和 Release 均有效

  • 在“链接器”选项卡的“其他链接器选项”中添加以下内容

    -static
    -static-libgcc
    -static-strc++
    -lwinpthread
    
  • 在工具栏上选择“调试”并按构建(黄色齿轮图标)

  • 按下绿色运行图标并确认构建正常

测试

  • 打开终端窗口并转到 HelloWorld\bin\debug 文件夹
  • 从那里开始 hello world。
  • 在不要求任何 DLL 的情况下确认它可以工作。

您也可以从资源管理器窗口启动它并确认它也不会要求 DLL。

注意:在我的 Win7x64 系统上,当从资源管理器启动 HelloWorld.exe 时,添加“-lwinpthread”行会导致 CodeBlocks 忽略“Projects/Properties/Tab_BuildTargets/”中的设置“执行结束时暂停”。所以“Hello World”输出几乎不可见,因为窗口在执行后立即关闭(也许有人知道为什么)

请注意,如果您没有遇到 winpthread.dll not found 问题,那么您可能不会使用带有“posix”的 MinGW-W64 编译器线程模型。两个代码块 MinGW-W64 捆绑安装包都使用这样的版本。对于 CB20.03,来自 MinGW-W64 download page 的相关下载为

  • 32 位:8.1.0 ''i686-posix-dwarf''
  • 64 位:8.1.0 ''x86_64-posix-seh''

例如,如果我直接使用 Codeblocks 设置安装编译器并选择 32 位编译器包“i686-win32-dwarf”,则只有前 2 个 DLL 会丢失。在这种情况下,修复方法是将链接器选项仅设置为

  -static-libgcc
  -static-strc++