dda0025 发表于 2025-7-7 20:18

为什么gd32用arm gcc和用keil编译,大小差几倍?

GD32,用keil编译才30K+,但用arm-none-eabi-gcc编译出来有100K+,为什么会差好几倍?有哪里可以优化一下,减小一下arm-none-eabi-gcc编译的bin文件大小?

cen9ce 发表于 2025-7-19 22:17

GD32使用Keil编译后代码体积为30K+,而使用arm-none-eabi-gcc编译后体积达到100K+,这种显著差异主要源于库文件差异、优化策略不同、调试信息残留及内存对齐差异

liu96jp 发表于 2025-7-20 07:17

Keil:使用专为单片机优化的Microlib库,砍掉了C标准库中单片机开发不常用的功能,体积较小。GCC:默认使用Newlib库,功能更全面但体积较大。虽然GCC也有适合单片机的Newlib-nano库,但需手动配置。

g0d5xs 发表于 2025-7-20 09:25

优化策略不同,eil:编译器优化策略更贴近芯片特性,生成的代码更紧凑。GCC:虽然开源免费,但优化策略可能不如Keil精细,导致代码体积较大。

ex7s4 发表于 2025-7-20 11:09

调试信息残留,GCC编译时可能包含调试信息(如.debug_info、.debug_abbrev等段),这些信息不会写入单片机,但会增加ELF文件大小。若未正确配置编译选项,可能导致最终二进制文件体积膨胀。

b5z1giu 发表于 2025-7-20 13:15

不同编译器对结构体、变量的内存对齐方式可能不同,导致内存占用差异。例如,GCC和IAR在处理结构体内存对齐时的方法就存在差异。

suw12q 发表于 2025-7-20 17:13

在编译选项中添加-specs=nano.specs,并链接libc_nano.a和libm_nano.a库。

tax2r6c 发表于 2025-7-20 21:20

效果:显著减少代码体积,适用于资源受限的单片机。

q1ngt12 发表于 2025-7-21 07:58

使用-Os(优化代码大小)而非-O0(无优化)或-O2(平衡优化)。某些项目在使用-Os时可能出现运行问题,需结合代码调试。

p0gon9y 发表于 2025-7-21 12:39

在编译选项中添加-g0(禁用调试信息)或-s(移除符号表)。减少ELF文件大小,对最终二进制文件体积无直接影响,但可避免中间文件膨胀。

y1n9an 发表于 2025-7-21 15:24

使用__attribute__((packed))取消结构体优化对齐,或手动调整变量顺序以减少内存碎片。

classroom 发表于 2025-7-23 16:39

库函数实现差异吧

powerantone 发表于 2025-7-23 16:41

启用-Os + -flto        ,代码体积减少30%~50%。

flycamelaaa 发表于 2025-7-23 17:40

GCC默认生成DWARF格式调试信息,即使未启用调试选项,也可能保留部分符号表,增加二进制体积。

stormwind123 发表于 2025-7-23 17:41

用newlib-nano

probedog 发表于 2025-7-23 20:41

链接时裁剪未使用段

classroom 发表于 2025-7-23 21:42

替换高开销库函数,减少动态调用开销。

beacherblack 发表于 2025-8-5 16:01

不同的编译器可能有不同的默认优化级别。

chenjun89 发表于 2025-8-6 08:21

优化等级不一样吧

chenqianqian 发表于 2025-8-6 08:44

应该是代码编译的优化等级不一样导致的吧
页: [1] 2
查看完整版本: 为什么gd32用arm gcc和用keil编译,大小差几倍?