有没有办法静态链接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库吗?
答案 0 :(得分: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。
答案 1 :(得分:0)
我也遇到了这个问题-一个仅使用stdio.h
和string.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(而不是MSYS2)外壳内部安装mingw64
gcc
-
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-很棒的:)