使用MinGW的C可执行文件大小
我通常用C语言编写大小编码演示竞赛(64kb),但考虑转到C语言.
在MinGW下我对.exe-size有些麻烦. (在使用可执行程序包装程序之前,我必须将其降低到<100 kb.). 我看过这个: 这个小小的helloworld只有10 kb(可以): #include "windows.h" int main() { MessageBoxA(0,"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:是否可以在MinGW / g 4.8.1中使用-shared-libstdc或-lstdc _s? 可选2:当我尝试-nostdlib并用WinMain替换main时: #include "windows.h" int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { MessageBoxA(0,0); return 0; } 我没有编译器警告,但运行时崩溃,它编译为C时工作正常. (可选,因为我不希望你/我花时间调试crt-startup,编译器 – 链接器标志来修剪库会更有帮助) 解决方法
这些额外的字节被标准库调用“拉入” – 高级别的字节往往会带来它们下面的所有内容,内存分配,它们使用的异常等等.最简单的方法是尽量减少使用的内容.在putchar()上建立一个hello世界可能会给你一个很好的比较点.我将专注于静态链接的程序,因为我知道,rubenvb的答案似乎无论如何都能很好地覆盖共享库.
新的,删除,纯虚函数等功能也可以提取库中的位以及下面的许多依赖项.关于如何替换它们的快速概述在这里:http://ptspts.blogspot.com.au/2010/12/how-to-write-c-program-without-libstdc.html – 如果你真的非常极端,你可以找到以相同方式处理的malloc版本. 最近使用C 11,如果你这样做,你会遇到__cxa_guard_acquire和__cxa_guard_release: int foo() { static int bar = 1; //thread safe in C++11,requires inbuilt functions } 为此,如果编译器支持,请使用-fno-threadsafe-statics标志. 如果这不能让你足够远,你可以链接linux版本的ld上的标志-Map = filename.map来生成一个“map”文件.输出文件的第一部分列出了每个被拉入的部分以及需要它的部分.* *地图文件还会显示函数部分对标准库没有任何作用,因为它已经在没有该标志的情况下编译,除此之外 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |