我使用GCC 5.2.0编译EFM32 MCU的代码(基于Cortex-M内核)。当我想要#include <iostream>
时,我注意到代码大小的大幅增加。
例如,让我们为EFM32WG&#34; Wonder Gecko&#34;编译以下代码。芯片:
#include "em_device.h"
#include "em_chip.h"
#include <iostream>
int main(void)
{
CHIP_Init();
while (1) {
}
}
此代码将生成172048字节的代码,而没有#include <iostream>
则只有1440字节。
我通常只使用cout
进行调试输出(通过为newlib实现_write
函数并将输出路由到SWO引脚),但考虑到MCU,这种方法看起来非常浪费只有256k的闪存,只是包含这个标题会使代码用完大部分。
所以,我的问题是:为什么包含iostream标头使编译后的代码占用如此疯狂的闪存空间?还有,有办法解决它吗?
修改
编译器和链接器都是arm-none-eabi-g++
(版本5.2.0),C库是nano C库(我认为)。
以下是我的C ++编译器标志(不包括包含路径):
-g -gdwarf-2 -mcpu=cortex-m4 -mthumb '-DEFM32WG940F256=1' -O0 -Wall -c -fmessage-length=0 -mno-sched-prolog -fno-builtin -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
这是我的链接器标志:
-g -gdwarf-2 -mcpu=cortex-m4 -mthumb -T "${BuildArtifactFileBaseName}.ld" --specs=nosys.specs -Xlinker --gc-sections -Xlinker -Map="${BuildArtifactFileBaseName}.map" -mfpu=fpv4-sp-d16 -mfloat-abi=softfp --specs=nano.specs
我尝试使用和不使用优化,但结果代码大小保持不变(优化后的大小可能小1k)。
编辑2
-fno-rtti
和-fno-exceptions
也无法帮助解决代码问题。
答案 0 :(得分:0)
尽管编译器确实尝试消除了未使用的完整包含或部分包含,但这有时会失败。仅包含一些标头 导致代码运行-这意味着,即使您未引用标头中包含的任何内容,编译器也无法自由地从标头中删除代码。
<iostream>
是一个示例,它声明了一些全局对象,这些对象的
构造函数在调用main之前运行。它的包含将大致
将STM32的二进制文件大小增加140kB。
您可以在github上检查gcc开发人员的这种行为和推理。
解决方案是避免在微控制器上使用C语言提供的打印功能,例如printf()
。