当前位置: 首页 > news >正文

cpp减小可执行文件、动态库大小

优化程序大小编译选项

1. gcc

1.1 编译选项

选项作用
-O3启用最大优化,适用于 Release
-ffunction-sections每个函数放入自己的段
-fdata-sections每个全局变量放入自己的段
-fvisibility=hidden默认隐藏符号,避免导出未用的函数(用于 .so
-fno-rtti(可选)禁用 RTTI,适用于非多态代码(小幅减少体积)

1.2 链接选项

选项作用
-Wl,--gc-sections丢弃未使用函数或变量的段(配合 -ffunction-sections
-Wl,-s-s去除符号表和调试信息(最小化产物)

1.3 cmake示例

if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -ffunction-sections -fdata-sections -fvisibility=hidden")set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -Wl,--gc-sections -s")
endif()

2. msvc

2.1 msvc编译选项

选项作用
/O2最大优化(Release 默认)
/GL启用 Whole Program Optimization(必须与 /LTCG 配合使用)
/Gw全局变量的函数级链接(VC++ 2022+)
/Gw-禁用全局变量函数级链接(仅调试时)
/GF合并只读字符串常量
/Gy函数级链接,配合 /OPT:REF

2.2 链接选项

选项作用
/LTCG启用 Link Time Code Generation(与 /GL 配合使用)
/OPT:REF删除未引用的函数和数据
/OPT:ICF合并相同的代码和数据段(Identical COMDAT Folding)
/INCREMENTAL:NO禁用增量链接(必须禁用,才能让 /LTCG 生效)
/SUBSYSTEM:WINDOWS如果你是 GUI 应用(无控制台窗口)

2.3 对应cmake

set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)  # 等价于 /GL + /LTCGif (MSVC)add_compile_options(/O2 /Gy /Gw /GF /GL)               # 编译器优化add_link_options(/LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO /SUBSYSTEM:CONSOLE)
endif()

3. 效果

静态链接opencv库:40MB->17MB

http://www.dtcms.com/a/279008.html

相关文章:

  • 4.2TCP/IP
  • 什么是微服务?-核心思想:化整为零,各自为战
  • 单向链表、双向链表、栈、队列复习(7.14)
  • Windows 安装配置Claude Code
  • Java实现文件自动下载,XXL-Job定时任务中的HTTP文件下载最佳实践
  • C++-linux 7.文件IO(二)文件描述符、阻塞与非阻塞
  • .net天擎分钟降水数据统计
  • .NET控制台应用程序中防止程序立即退出
  • Flask服务器公外网访问,IPv6(亲测有效!!!!)
  • 网络编程(TCP连接)
  • .NET ExpandoObject 技术原理解析
  • LeetCode经典题解:206、两数之和(Two Sum)
  • OV-DINO:基于语言感知选择性融合的统一开放词汇检测
  • 深入解析ThreadLocal:线程隔离利器
  • C#自定义控件
  • c# 深度解析:实现一个通用配置管理功能,打造高并发、可扩展的配置管理神器
  • Typecho加密文章HTML结构自定义完全指南
  • 在 Windows 主机和 VMware 虚拟机中的 Ubuntu 系统之间实现复制粘贴,
  • Spring IoC 容器实战:从解耦到集成的 6 大核心应用场景
  • 【PTA数据结构 | C语言版】字符串插入操作(不限长)
  • 微前端框架深度对决:qiankun、micro-app、wujie 技术内幕与架构选型指南
  • Ubuntu-25.04 Wayland桌面环境安装Anaconda3之后无法启动anaconda-navigator问题解决
  • 如何降低AIGC的查重率?精选六个AIGC降重让论文更出色
  • Spring Boot项目结构解析:构建高效、清晰的代码框架
  • 【Python进阶】深度复制——deepcopy
  • STM32F1_Hal库学习EXTI
  • 苍穹外卖学习指南(java的一个项目)(老师能运行,但你不行,看这里!!)
  • 最近要上Android 15的高通平台,按照之前Android14的高通平台的裁剪APP的方法修改,发现一改编译之后就不能进系统
  • LLaMA.cpp HTTP 服务参数: --pooling 嵌入模型 池化类型详解
  • 笔试——Day7