MSYS2静态链接输出二进制

问题描述 投票:3回答:2

有没有办法静态链接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
2个回答
5
投票

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

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

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


0
投票

我也有这个问题 - 一个非常简单的终端程序,只使用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

请注意,如果你在MSYS2 shell中,这个 - /usr/bin/gcc - 就是完全相同的路径。

所以,我试着在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)shell中安装:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.