vc6编译出小体积pe文件

VC写的程序体积是挺大的,网上也有很多优化的文章,都是针对VC6.0来说的。我把我的总结下。
 
#include <windows.h>
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"user32.lib")
 
写Win32程序的话,windows.h 是必须的,使用动态连接必要的系统库,可以把link下的链接库全部删除,需要就练级。
 
 
 
 
 
#pragma comment(lib,"msvcrt.lib")
 
这句是用来动态连接VC库的,使用VC6.0的可以加上,但是使用VS2008以后的就不要加了。我是用VS2010的时候,编译后需要 msvcr100.dll 文件。VS2010一旦静态链接了msvcrt.lib,体积立马上到28,如果复杂点的程序可能会更大。如个仅仅是一个HelloWorld,一个MessageBox的话,因为不需要用到msvcrt.lib,所以体积不会增加的,这个时候加不加这句话都无所谓。
 
#pragma comment(linker, "/SUBSYSTEM:windows")
 
这句是用来说明是win32程序,不是控制台的程序,控制台的程序会有个黑窗口。可以再程序里写,也可以再配置里写。
 
#pragma comment(linker, "/ENTRY:main")
 
这个用来更改入口函数,对vs2010编译的程序,效果很明显。一旦指定了入口函数,体积真的是立马下来了。
 
#pragma comment (linker, "/ALIGN:512")
 
对齐方式,这个我用VS2010测试的时候,修改这个,编译后的程序都提示不是有效的Win32程序。VC6.0上没问题。VS2010编译的同志就不要改了。VC6.0的可以修改测试,数值还可以减少。
 
#pragma comment(linker, "/merge:.data=.text")
#pragma comment(linker, "/merge:.rdata=.text")
 
合并区段。我认为是没什么必要,编译的时候会有警告。VS2010编译后可能会出现程序不能正常运行,VC6.0的正常,不推荐。
 
#pragma comment(linker, "/OPT:NOWIN98")
 
不对Windows 98系统做优化。VS2010已经取消了这个选项,如果加上这句话,编译的时候会出现警告。VC6.0加着句话,也能减少不少的体积。VC6.0上,推荐使用。
 
OPtimization        Minimize Size(/O1)
 
C/C++选项里的,最小体积编译,效果不明显。
 
 
 
最后看下效果:
 


Code Snippet
 
#include <windows.h>
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"user32.lib")
#pragma comment(linker, "/SUBSYSTEM:windows")
#pragma comment(linker, "/ENTRY:main")
 
int main()
{
    MessageBox(NULL, TEXT("hello!"), TEXT("hi"), 0) ;
    return 0 ;
}
 
 
 
 
 
 
 
这段代码使用VS2010编译后体积也只有3K。其他一些优化,对体积的影响不明显,基本可以忽略不计。不过大家有兴趣的话,可以自己测试。如果找到其他优化的方法也记得和我说下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为了在VC6中编译protobuf,需要进行以下步骤: 1.下载protobuf源代码并解压缩。 2.打开VS6,创建一个新的Win32控制台应用程序。 3.将protobuf源代码中的src目录添加到项目中。 4.在项目属性中,选择C/C++选项卡,然后选择预处理器选项卡。在预处理器定义中添加HAVE_PTHREAD。 5.在项目属性中,选择C/C++选项卡,然后选择代码生成选项卡。在运行库中选择多线程调试(/MTd)。 6.在项目属性中,选择链接器选项卡,然后选择输入选项卡。在附加依赖项中添加libprotobuf.lib。 7.在项目属性中,选择链接器选项卡,然后选择系统选项卡。在子系统中选择控制台(/SUBSYSTEM:CONSOLE)。 8.编译并运行程序。 ```shell // 示例代码 #include <iostream> #include <fstream> #include <string> #include "google/protobuf/message.h" #include "google/protobuf/descriptor.h" #include "google/protobuf/compiler/importer.h" #include "google/protobuf/dynamic_message.h" #include "addressbook.pb.h" using namespace std; using namespace google::protobuf; using namespace google::protobuf::compiler; int main(int argc, char* argv[]) { GOOGLE_PROTOBUF_VERIFY_VERSION; DiskSourceTree sourceTree; sourceTree.MapPath("", "./"); Importer importer(&sourceTree, NULL); importer.Import("addressbook.proto"); const Descriptor* descriptor = importer.pool()->FindMessageTypeByName("tutorial.Person"); const Message* prototype = importer.pool()->FindMessageTypeByName("tutorial.Person")->prototype(); DynamicMessageFactory factory; Message* message = factory.GetPrototype(descriptor)->New(); message->ParseFromString("..."); // 从字符串中解析Message cout << message->DebugString() << endl; // 输Message的Debug信息 delete message; google::protobuf::ShutdownProtobufLibrary(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值