
在MinGW下我对.exe-size有些麻烦. (在使用可执行程序包装程序之前,我必须将其降低到<100 kb.). 我看过这个:
How to reduce the size of executable produced by MinGW g++ compiler?
但是我已经在使用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",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”文件.输出文件的第一部分列出了每个被拉入的部分以及需要它的部分.*
*地图文件还会显示函数部分对标准库没有任何作用,因为它已经在没有该标志的情况下编译,除此之外
总结以上是内存溢出为你收集整理的使用MinGW的C可执行文件大小全部内容,希望文章能够帮你解决使用MinGW的C可执行文件大小所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)