g++命令编译出来的文件体积过大解决方案

简介: g++命令编译出来的文件体积过大解决方案

这几天在使用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命令去除符号信息了!

相关文章
|
11月前
|
传感器 人工智能 IDE
通义灵码编程智能体,上线!
通义灵码现在已经全面支持 Qwen3,并正式上线编程智能体,具备自主决策、环境感知、工具使用等能力,可以根据开发者的诉求,使用工程检索、文件编辑、终端等工具,端到端地完成编码任务。
856 148
|
Docker 容器
解决docker启动es自动关闭的问题
解决docker启动es自动关闭的问题
884 0
|
11月前
|
存储 人工智能 Kubernetes
AI 场景深度优化!K8s 集群 OSSFS 2.0 存储卷全面升级,高效访问 OSS 数据
阿里云对象存储OSS是一款海量、安全、低成本、高可靠的云存储服务,是用户在云上存储的高性价比选择…
|
Java 编译器 API
【小家Java】Lombok的使用详解(最详尽的解释,覆盖讲解所有可用注解),解决@Builder.Default默认值问题(下)
【小家Java】Lombok的使用详解(最详尽的解释,覆盖讲解所有可用注解),解决@Builder.Default默认值问题(下)
【小家Java】Lombok的使用详解(最详尽的解释,覆盖讲解所有可用注解),解决@Builder.Default默认值问题(下)
|
存储 Linux C++
CMake深度解析:掌握add_custom_command,精通Makefile生成规则(二)
CMake深度解析:掌握add_custom_command,精通Makefile生成规则
745 0
|
算法 量子技术
|
JavaScript 容器
Vue3折叠面板(Collapse)
该组件提供了一个高度可定制的折叠面板,支持多种属性设置,包括折叠面板数据、激活状态、禁用选项、边框风格、复制功能等,并可通过插槽进行进一步自定义。其丰富的样式控制选项使得面板能够适应各种场景需求。在线预览展示了不同配置下的效果。组件基于 Vue 3 开发,利用 `requestAnimationFrame` 模拟实现动画效果,并集成了按钮等其他自定义组件。
824 1
Vue3折叠面板(Collapse)
|
XML 开发工具 Android开发
Repo工作原理及常用命令总结——2023.07(下)
Repo工作原理及常用命令总结——2023.07(下)
3459 0
VScode中C++多文件编译运行问题(使用code runner配置)
VScode中C++多文件编译运行问题(使用code runner配置)