-
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://orlando.blogbus.com/logs/57815970.html
前段时间在实验室的一个项目上花了很大的功夫去构架一个全插件的框架,花了很大功夫眼看就要完成了,
遇到了VS2008编译的程序无法在目标机器上运行,需要安装VC2008 redistribute的麻烦,按照需求这种情况是完全不允许的。
于是就对此方面进行了一个较为详细的研究,最后解决了此问题,留此mark
首先需要说明的是如果你的需求允许安装VC2008 redistribute,你完全可以直接去MS下载次运行库。还有如果你的工程是MFC工程,脱离MSxxxx90.dll是绝对不可能的。下面详细说明如何脱离运行库与程序最小大小的优化,以下有部分方法来自网络,也有自己摸索的部分。
1.尽量使用标准VC的函数,不适用被CRT封装过的函数,并在编译的时候加上/nodefaultlib:msvcrt.lib 选项。这个可以避免编译器将CRT库编译进来。如果编译器找不到入口,用/entry:指定入口函数
2.使用HeapAlloc 和HeapFree,取代malloc和free,或者干脆使用以下代码重载
typedef UINT size_t;
void *malloc(size_t size) { return HeapAlloc (GetProcessHeap(),NULL,size); } void free (void *memblock) { HeapFree (GetProcessHeap(),NULL,memblock); } void *realloc(void *memblock,size_t size) { return HeapReAlloc (GetProcessHeap(),NULL,memblock,size); } void *operator new(size_t count) { return malloc (count); } void *operator new[](size_t count) { return malloc (count); } void operator delete(void* _Ptr) throw( ) { free (_Ptr); } void operator delete[](void* _Ptr) throw( ) { free (_Ptr); }
3.打开编译器的编译和链接的优化选项,去除未引用的XXX和优化大小。
如果编译出来的程序无法执行请调整/align更改节的对齐大小。
PS:最后说一句blogbus fuck you ! 用Chrome发文章都发不出来!!
收藏到:Del.icio.us
引用地址:







