【问题标题】:Using C++14 with AVR-GCC (Arduino Uno)将 C++14 与 AVR-GCC (Arduino Uno) 一起使用
【发布时间】: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


【解决方案1】:

经过一番搜索发现,从 C++14 开始的 C++ 定义了两个额外的 delete 运算符:

void operator delete (void* ptr, std::size_t sz) noexcept; (5)(C++14 起)
void operator delete[]( void* ptr, std::size_t sz ) noexcept; (6)(C++14 起)

5-6) 如果提供了用户定义的替换,则调用而不是 (1-2),但未指定在删除不完整类型和数组的对象时调用 (1-2) 还是 (5-6)非类和可简单破坏的类类型。内存分配器可以使用给定的大小来提高效率。标准库实现与 (1-2) 相同。

(来自https://en.cppreference.com/w/cpp/memory/new/operator_delete

ArduinoCore-avr's source,这些其实是存在的,定义如下:

#if __cplusplus >= 201402L
void operator delete(void* ptr, std::size_t size) noexcept {
  operator delete(ptr);
}
void operator delete[](void * ptr, std::size_t size) noexcept {
  operator delete[](ptr);
}
#endif // __cplusplus >= 201402L

但是,似乎有一段时间没有 ArduinoCore-avr 的新版本了,最后一个版本早于这个(相对较新的)代码。

在我自己将上述定义添加到我的代码后,它会编译:)

【讨论】:

    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多