Linker 是否可以使用MINGW g++;?

Linker 是否可以使用MINGW g++;?,linker,g++,compilation,Linker,G++,Compilation,我知道MINGW-g++编译更大的可执行文件,因为它静态链接了很多东西。另一方面,MSVC++根据VCRedist包中的DLL动态链接,这就是为什么它会生成更小的可执行文件 但是,是否可以在windows上以类似的方式使用g++进行编译?不一定是MINGW-g++而是我可以与Qt Creator一起使用的东西(我没有添加Qt作为标记,因为它与问题无关)。您可以使用cygwin(www.cygwin.com)。它们使用运行时DLL,非常类似于MSVCRT。当然,您的程序依赖于cygwin运行时(抱

我知道MINGW-g++编译更大的可执行文件,因为它静态链接了很多东西。另一方面,MSVC++根据VCRedist包中的DLL动态链接,这就是为什么它会生成更小的可执行文件


但是,是否可以在windows上以类似的方式使用g++进行编译?不一定是MINGW-g++而是我可以与Qt Creator一起使用的东西(我没有添加Qt作为标记,因为它与问题无关)。

您可以使用cygwin(www.cygwin.com)。它们使用运行时DLL,非常类似于MSVCRT。当然,您的程序依赖于cygwin运行时(抱歉,这是一种重言式)。

MinGW完全能够动态链接到msvcrt运行时。用这种方法无法摆脱的唯一麻烦是GCC/MinGW启动代码,它不是很大

一个小型C++测试程序(简单的IoSoelHello World程序,注释:我得到了一个普通C PrtTF版本的相同结果)。 可执行文件大小:

GCC:13kB

MSVC:6kB


虽然这是双倍的,但所有必要的启动代码都会造成很大的差异;对于较大的程序,差异可以忽略。

为了公平比较VC++和使用静态链接的MinGW,我建议删除上面命令行语法中的编译器开关/MD。这将导致VisualC++编译器静态链接静态库,但仍然,Visual C++编译器将生成比MinGW静态编译的小得多的可执行文件。

因为VisualC++编译器使用的链接器有一个称为函数级链接的特性,因此,链接器只根据代码中使用的函数链接必要的库。任何未引用或未使用的函数都不会链接到生成的最终可执行文件,从而生成更小的静态链接二进制文件

使用VisualC++编译器返回上面的示例,这次使用静态链接,命令行语法将是:

cl/Os main.cpp/link/out:test2.exe

您可以注意到,我已经删除了/MD开关,因此编译器将使用静态链接而不是动态链接

现在,为了制作一个更小的静态链接可执行文件,我建议使用命令行语法:

cl/Ox main.cpp/link/FILEALIGN:512/OPT:REF/OPT:ICF/INCREMENTAL:NO/out:test2.exe

如果您检查生成的二进制文件,您会注意到它要小得多,这也是一个静态链接的可执行文件

我实际上是从这个网站上的讨论中得到这个想法的

大多数Delphi的PASCAL编译器也具有相同的链接特性,称为智能链接,但静态链接的可执行文件比Visual C++编译器所产生的小得多。 MinGW使用的链接器非常愚蠢,它不知道膨胀,因此,它链接了许多静态库,包括那些包含函数或例程的库,这些函数或例程在源代码中根本没有使用,从而导致静态链接的二进制文件非常膨胀


我建议倒排明文,而不是用Visual C++编译器。甚至MinGW的开发人员似乎也不关心使用静态链接减少代码膨胀。

是使其链接到VC运行时的-MD开关吗?MinGW始终链接到VC运行时(C:\Windows\System32中的msvcrt.dll)
-MD
的作用与MSVC的
/MD
完全相同。我认为您误解了MinGW的功能:它构建本机可执行文件就像visualstudio编译器一样,但是使用GNU工具链。因此,有一小部分代码不是在两者之间共享的,而是始终隐藏在用户之外的。C++的ABI也有一点不同(G+C++链接到GCC的LIbSTDC++ +,而不是MS的,与C库形成对比,这两种情况都是一样的),但这是对差异的总结。你们尝试过剥离二进制文件吗?是的,我做到了。还有,UPX(也可以是条带)。我的问题特别是Qt应用程序,我看到一些预编译的示例大小约为100K,但当我重新编译它们时,它们的大小是原来的5-8倍,并且没有调试版本。谢天谢地,我刚刚了解到,使用Qt的MS编译器只是使用MSVC版本QT SDK.@ TAMAs:在您的情况下,非常可能的是,使用一个仅使用C++标准库静态构建的MIWW版本,这可以解释额外的膨胀。Mine使用libstdc++作为dll。但事实上,将MSVC与Qt结合使用一点也不难。MinGW中的链接器替代品是否有所减少?我想继续使用g++,因为我开发的大多数应用程序都是交叉编译到Linux和Windows的。如果我在这两个平台上都使用g++的话,那就相对比较轻松了。至于替代品,我现在正试图在谷歌上搜索,但目前还没有找到任何合适的答案。既然您真的想继续使用g++而不需要任何代码膨胀,我建议您使用此编译器的动态链接,并在应用程序中包含必要的DLL或库(如果您希望将其部署到其他计算机上),以避免Windows环境中的依赖性问题(也称为DLL地狱)。如果您要在Linux中开发应用程序,它附带的gcc和g++编译器默认使用动态链接,据我所知,大多数Linux发行版都有您开发的应用程序所需的所有运行时库,如果要在使用Linux的其他计算机上部署应用程序,可能不需要担心应用程序中包含的必要运行时库。是的,Qt Creator中的默认设置还将Qt本身动态链接到应用程序。建议的部署方法是在应用程序目录中发送DLL。这很好用。我不完全同意的是,与VC++相比,gcc的主exe大小更大(甚至t)
#include <iostream>

using namespace std;

int main()
{
cout << "Hello World!" << endl;
return 0;
}
g++ main.cpp -MD -Os -s -o test.exe
cl /MD /Os main.cpp /link /out:test2.exe