g++编译器标志以最小化二进制大小

g++ compiler flag to minimize binary size

本文关键字:二进制 最小化 编译器 标志 g++      更新时间:2023-10-16

我有一个Arduino Uno R3。我正在使用C++为我的每个传感器制作逻辑对象。Arduino的板载内存非常有限,32KB*,平均而言,我编译的对象大约是6KB*。

我已经在使用所需的尽可能小的数据类型,以尽量减少内存占用。是否有编译器标志来最小化二进制文件的大小,或者我是否需要使用较短的变量和函数名、较少的函数等来最小化我的代码库?

此外,对于最小化二进制大小的任何其他提示或建议都将不胜感激。

*它可能不是以KB为单位测量的(因为我面前没有它(,但1个对象大约是我总内存大小的1/5,这引起了我的担忧。

除了us2012和其他在评论中提到的技术外,还有很多减少二进制大小的技术,我用自己的一些观点总结了这些技术:

  • 使用-Os使gcc/g++对大小进行优化
  • 使用-ffunction-sections -fdata-sections将每个函数或数据分离为翻译单元中不同的部分。将它与链接器选项-Wl,--gc-sections结合起来,可以去掉任何未引用的部分
  • 至少使用以下选项运行strip-s -R .comment -R .gnu.version。它可以与--strip-unneeded组合,以移除不需要重新定位处理的所有符号

如果您的代码不包含c++-异常处理,您可以节省大量空间(在Tuxdude提到的所有优化步骤之后,最多可以节省30k(。因此,您必须提供以下标志:-fno-exceptions

但是甚至如果使用异常,则可以包括异常处理!检查以下步骤:

  1. no usage of new, delete。如果你真的需要它,用malloc/free包装代替它们。例如,搜索"tinynew.cpp">

  2. 为纯虚拟呼叫提供功能,例如extern "C" void __cxa_pure_virtual() { while(1); }

  3. 覆盖__gn_cxx::__verbose_terminate_handler((。它处理未处理的异常,并进行名称去映射,这是相当大的!(例如,具有9.5k的d_print_comp.part.10或具有1.8k的d_type(

干杯Flo