我使用GCC 5.2.0编译EFM32 MCU(基于Cortex-M内核)的代码。当我想#include <iostream>
时,我注意到代码大小急剧增加。
例如,让我们为EFM32WG“ Wonder Gecko”芯片编译以下代码:
#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
也不帮助使用代码大小。
尽管编译器确实尝试消除了未使用的完整包含或部分包含,但这有时会失败。仅包含一些标头导致代码运行-这意味着即使您未引用标头中包含的任何内容,编译器也无法从其中删除代码。