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

Wol*_*ler 53 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(Root target) - > Other Options
  5. 在已设置的"-fexceptions"下输入"-static"(或"-static-libstdc ++")
  6. CTRL-F9:构建项目(不执行)
  7. 在Windows资源管理器中导航到运行构建的"Hello World.exe"文件.
  8. 当消息弹出"错误:您的计算机缺少libstdc ++ - 6.dll"时,单击"确定".
  9. 将"libstdc ++ - 6.dll"从/ MinGW/bin /目录复制到"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!
    
    Run Code Online (Sandbox Code Playgroud)

编辑: 我的命令行是:

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
Run Code Online (Sandbox Code Playgroud)

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

// main.cpp
#include <iostream>

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

mos*_*o-x 44

你的命令错了!

转到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
Run Code Online (Sandbox Code Playgroud)

那么你将不再需要复制DLL(用于你的Hello World程序).

其他说明:

MinGW安装说明建议进行设置

c:\minGW;c:\MinGW\bin;
Run Code Online (Sandbox Code Playgroud)

到PATH环境变量.

通常是

-static -static-libgcc -static-libstdc++
Run Code Online (Sandbox Code Playgroud)

链接器选项应该工作(一次尝试所有3个).但不是libwinpthread-1.dll.

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

没有"-static-something"命令.

只能将标准库libgcclibstdc ++设置为静态链接.

对于其他库,首先使用"-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")
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的一个陷阱:如果你的应用程序链接到DLL(例如wxbase)并且该DLL动态链接到libstdc ++那么你就不走运了(并且为什么添加`-static-libstdc ++`不会删除会很困惑来自依赖项的libstdc ++直到你意识到发生了什么!) (5认同)
  • *最终我希望能够运行程序只有目录中的exe*...它似乎没有包装DLL正是他想要做的.如果存在所有运行时库的静态库版本,那么应该是可能的. (4认同)
  • 对于**libwinpthread-1.dll**,可以使用以下链接器技巧`-Wl,-Bstatic, - whole-archive -lwinpthread`详细[此处](http://stackoverflow.com/a/43402308/ 7023624).这将静态链接**winpthread**而不必求助于'-static`. (3认同)
  • 因为他可能想分发该应用程序,并且不希望客户端必须安装MinGW或修改环境变量 (2认同)
  • 出于某种原因,三个命令行选项没有改变任何东西。(进行了编辑)另外,Praetorian 是对的。我可以用 exe 打包 dll(如果我这样做了),或者添加 env 变量以使其在 **my** 机器上工作,但是对于打印“Hello World!”的控制台应用程序似乎过度了。需要3个dll文件。对我来说,它看起来像是不必要的批量,我可能会编写的其他更高级的应用程序也将标记它。最重要的是,查看其他更高级的应用程序,所包含的 dll 是开发人员创建的库或类似的东西。 (2认同)

J.J*_*ala 9

-static-libgcc如果使用例外,可能是一个坏主意.链接选项文档说明

在某些情况下,应用程序应使用共享libgcc而不是静态版本.其中最常见的是应用程序希望在不同的共享库中抛出和捕获异常.在这种情况下,每个库以及应用程序本身都应该使用共享libgcc.