【问题标题】:How to reduce the size of executable produced by MinGW g++ compiler?如何减小 MinGW g++ 编译器生成的可执行文件的大小?
【发布时间】:2011-11-01 21:40:38
【问题描述】:

我有一个简单的“Hello world”C++ 程序,它在 Win XP 下由 MinGW g++ 编译器编译为 500kB 可执行文件。 有人说这是由 iostream 库和 libstdc++.dll 的静态链接引起的。

使用 -s 链接器选项有点帮助(减少 50% 的大小),但我只对

是否可以使用动态链接将 libstdc++.dll 与可执行文件一起复制?如果可以,如何实现?


已解决:我使用的是 MinGW 3.4。现在我更新到最新的 MinGW 4.6,大小减少了 90% 到 50kB,-s 选项甚至到了 9kB,这完全足够了。无论如何-感谢大家的帮助。给你我的结果

C++ Hello World 程序使用 iostream

MinGW | no options | -s option
------------------------------
3.4   | 500kB      | 286 kB
4.6   | 50kB       |   9 kB

【问题讨论】:

  • 使用 -shared-libstdc++ 编译并动态链接 libstdc++.dll,使用 -Os 优化二进制文件的大小。
  • 虽然它不像 C++,你可以试试printf()。我不确定它与 iostream 库共享多少相同的依赖项。所以它可能会也可能不会变小。
  • @birryree: g++: error: unrecognized option '-shared-libstdc++' 使用 MinGW 4.6
  • @Jan - 是的,我认为在 GCC 4.6 中,您生成的二进制文件符合共享 libstdc++ 预期的正常大小 - 在具有 GCC 4.6 的 Linux 上,一个简单的“hello world”应用程序为 8 KB我。 MinGW 的 GCC 3.4 生成的大小是如此之大,因为还没有共享 libstdc++ 的概念。
  • 在标准库动态链接的MinGW更高版本下,可以通过-static-libgcc(C)或-static-libstdc++(C++)选项强制标准库的静态链接。

标签: c++ optimization mingw executable


【解决方案1】:

要使用的标志:

  • -s 就像你一直在做的那样去除符号
  • -lstdc++_s 指定动态链接到 libstdc++.dll
  • -Os 优化二进制文件的大小。

默认情况下,mingw 静态链接到 Windows 上的 libstdc++.a

请注意,lstdc++_s 标志仅在 GCC > 4.4 的 MinGW 中,我相信。

【讨论】:

  • 我在使用 4.6 版本时收到此错误(其他选项效果很好)-d:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../mingw32/bin/ld.exe: cannot find -lstdc++_s
  • @Jan - 查看 mingw 的发行说明,他们切换到在 4.5.x 中动态链接 libstdc++,所以这应该是 4.6 中的默认设置,我猜他们删除了标志将使用的库。不确定您是否仍在静态链接 libstdc++,但您可以在二进制文件上运行 DependencyWalker 或 ldd 以查看是否正确。
  • ldd 未找到,ld 删除了可执行文件(?)它是 MinGW 还是 Msys 的一部分?
  • @Jan - ldd 一个 Linux/Unix 工具,可让您找出二进制链接到哪些库,altbinutils-pe 包提供了一个 MinGW windows 等效项。 Dependency Walker / depends.exe 是一个可以单独安装的工具(也随 Visual Studio 一起提供),它提供了一个 GUI,允许您找出二进制链接到的内容。 ld 是一个不同的命令,是 gcc 的链接器。
  • -s 选项是否适用于需要调用符号名称的库?
【解决方案2】:

试试stripUPX

【讨论】:

    【解决方案3】:

    使用 -Os 标志可能会有所帮助。这优化了大小。

    【讨论】:

      【解决方案4】:

      您应该使用 -O 进行优化。将“-O{level}”添加到您的编译器参数中,它将针对速度或大小进行优化。检查您的编译器的文档。

      您还可以启用调试符号。剥离它们也会使其更小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 2012-09-02
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        相关资源
        最近更新 更多