我使用 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
用于调试输出(通过实现_write
函数 newlib 并将输出路由到 SWO 引脚),但看起来这种方法非常浪费,考虑到 MCU 只有 256k 闪存,仅包含此头文件就会使代码耗尽大部分闪存。
所以,我的问题是:why包含 iostream 头会使编译后的代码占用如此多的闪存空间吗?还有,有办法解决吗?
EDIT:
编译器和链接器都是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)。
EDIT 2
-fno-rtti
and -fno-exceptions
对代码大小也没有帮助。