【问题标题】:MSYS2 statically link output binaryMSYS2 静态链接输出二进制
【发布时间】:2016-05-30 11:43:22
【问题描述】:

有什么方法可以从 MSYS2 gcc 静态链接生成的 .exe 文件?我尝试了很多方法,但都没有奏效。所有生成的 .exe 文件都需要 msys-2.0.dll,我想摆脱它。到目前为止,我尝试启用 -ststic 选项、-static-libgcc 选项并将这些选项传递给 -Wl,但它们都不起作用。我尝试是否剥离二进制文件,但输出文件大小没有区别。我知道我可以在 MSYS1.0 gcc 或 Linux 的 mingw-w64 中执行此操作,但在 MSYS2.0 中无法执行此操作。运行 gcc -v 后,显示工具链确实是用 --enable-static 以及 --enable-shared 和 --enable-shared-libgcc 编译的。无论如何我可以获得静态 libgcc 库吗?

【问题讨论】:

    标签: gcc static-linking msys


    【解决方案1】:

    好吧,我解决了。从 MSYS2 的文档中可以看出,MSYS2 旨在通过使用通用的共享 libc 来缓解 DLL 地狱和错误。因此,它不打算创建静态链接的可执行文件。

    但是,您可以从 pacman 安装 mingw-w64 软件包,然后运行 ​​mingw64.exe 来启动 shell,而不是 msys2.exe。通过这样做,您可以从 bash 安装和运行原始的 mingw-w64 编译器套件,而不是 MSYS2 版本。

    原始mingw-w64包生成的可执行文件是静态链接的。它不需要 msys-2.0.dll,而是需要无处不在的 msvcrt.dll。

    【讨论】:

      【解决方案2】:

      我也有这个问题 - 一个非常简单的终端程序,仅使用 stdio.hstring.h,往往会引发“代码执行无法继续,因为找不到 msys-2.0.dll。重新安装程序可能会解决这个问题问题。”在普通终端中。

      最后,这篇文章帮助解决了这个问题 - 但有一些微妙的问题,我会在此说明。

      现在,我的问题是:

      我从安装 MSYS2 开始;显然我已经在其中安装了 GCC。

      现在,即使我更改为 MINGW64 终端(而不是 MSYS2 终端)并重新编译,我也会遇到与 msys-2.0.dll 相同的问题。

      最后,我想到了在 MINGW64 终端上签到:

      user@DESKTOP MINGW64 /c/
      $ which gcc
      /usr/bin/gcc
      

      请注意,这 - /usr/bin/gcc - 与返回的路径完全相同,如果您在 MSYS2 shell 中。

      所以,我再次尝试在 MINGW64 shell 中查找 gcc:

      $ pacman -Ss gcc
      mingw32/mingw-w64-i686-gcc 7.4.0-1 (mingw-w64-i686-toolchain)
          GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
      ...
      mingw64/mingw-w64-x86_64-gcc 8.2.1+20181214-1 (mingw-w64-x86_64-toolchain)
          GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
      ...
      msys/gcc 7.4.0-1 (msys2-devel) [installed]
          The GNU Compiler Collection - C and C++ frontends
      ...
      

      啊哈,原来我没有安装mingw64 gcc - 我只安装了msys gcc

      所以,只需安装 mingw64 gcc - 当然是从 MINGW64(不是 MSYS2)外壳内部:

      user@DESKTOP MINGW64 /c/
      $ pacman -S mingw-w64-x86_64-gcc
      resolving dependencies...
      looking for conflicting packages...
      
      Packages (7) mingw-w64-x86_64-binutils-2.30-5  mingw-w64-x86_64-crt-git-7.0.0.5302.6c8f5629-1
                   mingw-w64-x86_64-headers-git-7.0.0.5302.6c8f5629-1  mingw-w64-x86_64-isl-0.19-1
                   mingw-w64-x86_64-windows-default-manifest-6.4-3  mingw-w64-x86_64-winpthreads-git-7.0.0.5273.3e5acf5d-1
                   mingw-w64-x86_64-gcc-8.2.1+20181214-1
      
      Total Download Size:    51.55 MiB
      Total Installed Size:  364.04 MiB
      
      :: Proceed with installation? [Y/n] y
      ...
      

      在此之后,您需要关闭并重新打开 MINGW64 shell;一旦你这样做,你可以看到:

      user@DESKTOP MINGW64 /c/
      $ which gcc
      /mingw64/bin/gcc
      

      ...现在 MINGW64 到 gcc 的路径是 /mingw64/bin/gcc - 而 MSYS2 中的路径仍然是 /usr/bin/gcc

      因此,如果我现在在 MINGW64 shell 中使用 gcc 编译,我使用 /mingw64/bin/gcc 编译,现在我生成的 .exe 可以在通常的 Windows 命令提示符下运行,而无需询问 msys-2.0.dll - 这是很棒:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-27
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        • 2015-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多