【发布时间】:2021-11-22 23:34:18
【问题描述】:
我正在尝试让我的 Arduino 代码使用 -std=c++14 而不是默认的 -std=gnu++11 进行编译。为此,我添加到我的platformio.ini:
build_flags = -std=c++14
build_unflags = -std=gnu++11
但是,当我尝试编译时,出现以下链接器错误:
<artificial>:(.text+0x20a4): undefined reference to `operator delete(void*, unsigned int)'
(多次)
我似乎缺少delete 运算符。我发现了一些关于手动添加它的线程,这在过去似乎是 Arduino 所必需的。但是,现在不应该再出现这种情况了,使用默认的gnu++11 我没有这个问题。为什么 c++14(以及后来的标准及其 GNU 扩展)缺少此功能,而不是默认的 gnu++11?
我只有 avr-gcc(对于 Arduino Uno)有这个问题,对于 arm-none-eabi-g++(对于 Teensy),这个问题不会发生。
【问题讨论】:
-
它建议您的代码使用动态内存分配。无论如何,在 AVR 上通常都是不明智的。
-
我知道。如果您以正确的方式使用它(以避免碎片化),那很好。无论如何,它适用于
gnu++11,只是不适用于更高的 C++ 版本。这没有意义,对吧? -
碎片不是唯一要考虑的问题(如果您要删除分配,则隐含地没有避免碎片)。我不知道 Arduino 上的 C++14,但 Arduino 平台提供了 C++ 的简化子集,以至于它们在很大程度上避免提及 C++ 而不是“Sketch”。为此,可能根本没有实现 C++14 支持。你有点靠自己。如果你想使用所有的 C++,考虑完全放弃 Arduino 框架和它的限制,以获得更“成熟”的东西。
-
据我所知,AVR-GCC 完全支持所有 C++(即语言),但不支持完整的标准库(基本上由于大小限制)。 Tbh 我不明白为什么我必须放弃 Arduino 框架,因为如果有的话,这似乎是 AVR-GCC 的限制。我还在 Teensy LC(ARM MCU)上使用 Arduino 框架,我没有这个问题。
-
动态内存分配需要库移植层中特定平台的支持,因此 C++ 合规性并不是真正的问题
标签: c++ gcc embedded avr-gcc platformio