为了公平地比较使用静态链接的 VC++ 和 MinGW,我建议在上面的命令行语法中删除编译器开关 /MD。这将导致 Visual C++ 编译器与静态库进行静态链接,但 Visual C++ 编译器将生成一个比使用 MinGW 静态编译的可执行文件小得多的可执行文件。
由于 Visual C++ 编译器使用的链接器具有称为函数级链接的功能,因此,链接器仅根据代码中使用的函数链接必要的库。任何未引用或未使用的函数都不会链接到生成的最终可执行文件,从而生成更小的静态链接二进制文件。
回到上面使用 Visual C++ 编译器的示例,这次使用静态链接,命令行语法为:
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
如果您检查生成的二进制文件,您会注意到它要小得多,这又是一个静态链接的可执行文件。
我实际上是从http://www.catch22.net/tuts/minexe这个网站上的讨论中得到这个想法的
包括 Delphi 在内的大多数 Pascal 编译器也具有相同的链接功能,它被称为智能链接,但生成的静态链接可执行文件比 Visual C++ 编译器生成的要小得多。
MinGW 使用的链接器非常愚蠢,它不知道膨胀,因此,它链接了许多静态库,包括那些包含根本未在源代码中使用的函数或例程的静态库,从而导致非常膨胀的静态链接二进制文件。
我建议转储 MinGW 并改用 Visual C++ 编译器。即使是 MinGW 的开发人员似乎也不关心使用静态链接来减少代码膨胀。