这几天在使用gcc编译器的g++编译cpp文件时,发现即使是一个很简单的代码文件编译出来的exe体积会达到3M以上。我也通过上网究其原因,来和大家分享一下解决方案。
1,文件过大的原因
在使用gcc编译器时编译出来的exe是带有符号信息的。符号信息是什么?简而言之就是应用程序的调试信息,专门用来作调试之用,其中储存了程序变量以及其余很多信息。但是我们编译出来exe并仅仅只是去使用它时是不需要这些符号信息的。
我这里有一个main.cpp文件里面只写了hello world,使用g++命令编译,生成的exe文件足足有2.98MB。 我们使用nm命令来查看其符号信息:
nm main.exe
结果:
可见其符号信息非常多。
2,去除符号信息
那么我们的思路很清晰了,既然平时使用exe文件不需要符号信息,那么去掉符号信息就行了。使用strip命令:
strip 文件名
例如我执行:
strip main.exe
执行这时会发现编译出来的exe变小了许多,但是仍然可以正常运行。再使用nm命令查看它的符号信息,会提示已经没有符号信息了!
3,还可以进一步减少文件大小
如果觉得它不够小,我们还可以通过UPX压缩的方式。先下载UPX命令行程序:官网地址备用地址
在Windows下,下载解压出upx.exe
文件,通过cmd调用它。至于如何用cmd调用它这里不再过多赘述。
UPX命令使用方法:
upx [-123456789dlthVL] [-qvfk] [-o file] file 参数1: -1 最快压缩 -9 最大压缩 -d 解压缩 -l 列出压缩的文件 -t 测试压缩的文件 -V 显示版本信息 -h 显示更多帮助 -L 显示软件许可证 参数2: -q 安静模式 -v 详细模式 -o 指定输出文件路径(若带上此参数,原被压缩文件将保留) -f 强行压缩 -k 保留备份文件
下面举几个实例:
把main.exe压缩:
upx main.exe
压缩main.exe但是保留原来的main.exe
文件,另存压缩的文件到E:\mainc.exe
(通过-o
参数指定新生成文件,不加-o
就是压缩但不保留原来文件)
upx -o E:\mainc.exe main.exe
压缩main.exe
,指定压缩等级为最大(可见下面upx
带上了-9
这个参数,这个9就是压缩等级,压缩等级从1到9,1是最小压缩运行效率优先,9是最大压缩节省空间为主,可以配合上面的-o
参数一起使用):
upx -9 main.exe
若c.exe
已经被压缩,还可以通过upx
命令解压缩(-d
参数,同样可以配合-o
参数指定输出目录):
upx -d c.exe
下面我对上文的main.exe执行命令:
upx -9 main.exe
可以发现这个文件又减少了许多,但是还是可以正常运行。
还需要注意的是,若要同时去除符号信息和进行UPX压缩,必须先去除符号信息再使用UPX命令压缩!若先进行了UPX压缩你会发现无法使用strip命令去除符号信息了!