Exe 需要几个 gccdll 而不管代码是什么?

在使用 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. 在已经设置的“-feption”下输入“-static”(或“-static-libstdc + +”)
  6. CTRL-F9: 构建项目(不执行)
  7. 以文件资源管理器导航到并运行构建的“ Hello world. exe”文件。
  8. 当弹出一条消息说“ Error: libstdc + +-6.dll is miss from your computer.”时,单击“ OK”
  9. 将“ libstdc + +-6.dll”从/MinGW/bin/目录复制到“ Hello Worldd.exe”目录。
  10. 运行“ Hello World. exe”
  11. 单击“ OK”显示“ Error: libgcc _ s _ seh-1.dll 从您的计算机中丢失”的消息
  12. 将“ libgcc _ s _ seh-1.dll”复制到“ Hello Worldd.exe”目录中。
  13. 重复并最终将“ libwinpthread-1.dll”复制到上面。
  14. 查看信息

    Hello World!
    

Edit: My command line is:

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;
}
72484 次浏览

你的命令是错误的!

转到 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”命令。

只有标准库 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")

如果使用异常,-static-libgcc可能是一个坏主意

在几种情况下,应用程序应该使用 共享 libgcc 而不是静态版本 当应用程序希望引发和捕获异常时 不同的共享库。在这种情况下,每个库作为 以及应用程序本身应该使用共享的 libgcc。

上面对答案的注释包含完整的解决方案,因此我只想添加 CodeBlock 透视图。我用 CodeBlocks16和 MinGW-W648.1.0“ i686-posx-侏儒”在 Windows7x64上进行了验证。

这就解决了行动中心的问题

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

  • 接受向导中的所有默认值

  • 选择 Project/BuildOptions/并选择“ Hello World”

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

    -static
    -static-libgcc
    -static-strc++
    -lwinpthread
    
  • 在工具栏上选择“ Debug”,然后按 Build (黄色齿轮图标)

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

测试

  • 打开终端窗口,转到 HelloWorld bin 调试文件夹
  • 从那里开始你好世界。
  • Confirm it works without asking for any DLLs.

您还可以从资源管理器窗口启动它,并确认它也没有请求 DLL。

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

请注意,如果 没有有 OP 的 找不到 winpthread.dll问题,那么您可能不会使用具有“ posx”线程模型的 MinGW-W64编译器。两个代码块 MinGW-W64绑定的安装包都使用这样的版本。对于 CB20.03,从 MinGW-W64下载页面的相关下载将是

  • 32位: 8.1.0“ i686-posx-侏儒”
  • 64bit: 8.1.0“ x86 _ 64-posx-seh”

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

  -static-libgcc
-static-strc++