【发布时间】:2013-08-27 04:02:45
【问题描述】:
我通常用 C 编写大小编码演示制作比赛 (64kb),但考虑转向 C++。
在 MinGW g++ 下,我在 .exe 大小方面遇到了一些问题。 (在使用可执行打包程序之前,我必须将其降低到
我看过这个:
How to reduce the size of executable produced by MinGW g++ compiler?
但是我已经在使用 MinGW/g++ 4.8.1 和 -s -Os ...见下文(对于 4.8.1 也是:unrecognized option '-shared-libstdc++' 和 cannot find -lstdc++_s)。
这个小小的helloworld只有10 kb(没关系):
#include "windows.h"
int main() {
MessageBoxA(0, "test", "test", 0);
return 0;
}
但是当我添加:
#include <string>
...
std::string asdf;
变成 193 kb
当我添加:
#include <iostream>
然后它变成 756 kb。
我正在使用这些标志:
-std=c++11
-Wall
-s (or -Wl,-s)
-Os
-DNDEBUG
-fno-exceptions
-fno-rtti
(note: removed those with no effect)
必须有某种方法只链接我使用的东西。我错过了什么?
可选 1: 是否可以让 -shared-libstdc++ 或 -lstdc++_s 在 MinGW/g++ 4.8.1 中工作?
可选2:当我尝试-nostdlib并将main替换为WinMain时:
#include "windows.h"
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
MessageBoxA(0, "test", "test", 0);
return 0;
}
我没有收到编译器警告,但运行时崩溃,但在编译为 C 时它工作正常。 (可选,因为我不希望你/我花时间调试 crt-startup,编译器链接器标志来修剪库会更有帮助)
【问题讨论】:
-
您可以使用
strip命令吗? -
unix-world 命令?没有。
-
MinGW应该有这个命令,你试过了吗?
-
我刚刚从 mingw binutils 下载了 windows 版本的 strip,但使用
strip b.exe或strip -s b.exe并没有改变 exe 大小。我必须指定一些额外的参数吗? -
这些没有任何作用:
-ffunction-sections -fdata-sections -fvisibility-inlines-hidden哦,你到底为什么要关心?为什么有人会关心 Windows 上的二进制大小?另外,你有和 Linux GCC 和 MSVC 比较过吗?
标签: c++ windows mingw executable