我通常参加64kb大小编码比赛,使用C语言编写,但考虑转向C++。
在MinGW g++下,我遇到了一些.exe文件大小的问题(在使用可执行文件压缩器之前,我必须将其缩小到小于100 kb)。
我看过这篇文章:如何减少MinGW g ++编译器生成的可执行文件大小? 但是我已经在使用MinGW / g ++ 4.8.1并使用了-s -Os选项...详见下文(对于4.8.1也是如此:无法识别的选项'-shared-libstdc ++'和'找不到-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千字节。
我正在使用以下标志:
-std=c++11
-Wall
-s (or -Wl,-s)
-Os
-DNDEBUG
-fno-exceptions
-fno-rtti
(note: removed those with no effect)
有一种方法只链接我所使用的内容,我错过了什么吗?
可选项1:在MinGW/g++ 4.8.1上是否可能使-shared-libstdc++或-lstdc++_s起作用?
可选项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
命令? - billzstrip b.exe
或strip -s b.exe
并没有改变exe文件的大小。我需要指定一些额外的参数吗? - ben--gc-sections
链接时也可以节省空间,但在Windows上不行。所以就这个问题而言,它们什么也没做;-)。 - rubenvb