ESP8266 for Arduino IDE(xtensa-lx106-elf-gcc)和std :: map链接错误

时间:2015-10-31 11:19:54

标签: c++ gcc stl arduino-ide esp8266

是否有可能将地图与ESP8266一起用于Arduino包?

这是我的代码:

#include <map>

typedef std::map<int, int> Items;

void setup() {
  Items items;
  items[2]=5;
  //items.emplace(4,5);
}

void loop() {

}

这是编译/链接erorrs:

Arduino: 1.6.5 (Windows 8.1), Board: "Generic ESP8266 Module, Serial, 80 MHz, 40MHz, DIO, 115200, 512K (64K SPIFFS)"

sketch_oct31a.cpp.o: In function `loop':
C:\Program Files (x86)\Arduino/sketch_oct31a.ino:11: undefined reference to     `std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*,     std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)'
sketch_oct31a.cpp.o: In function `_M_emplace_hint_unique<const     std::piecewise_construct_t&, std::tuple<int&&>, std::tuple<> >':
c:\users\user\appdata\roaming\arduino15\packages\esp8266\tools\xtensa-lx106-    elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-    elf\include\c++\4.8.2\bits/stl_tree.h:1673: undefined reference to     `std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*,     std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)'
sketch_oct31a.cpp.o: In function `std::_Rb_tree<int, std::pair<int const,     int>, std::_Select1st<std::pair<int const, int> >, std::less<int>,     std::allocator<std::pair<int const, int> >     >::_M_erase(std::_Rb_tree_node<std::pair<int const, int> >*)':
c:\users\user\appdata\roaming\arduino15\packages\esp8266\tools\xtensa-lx106-    elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-    elf\include\c++\4.8.2\bits/stl_tree.h:1130: undefined reference to     `std::_Rb_tree_decrement(std::_Rb_tree_node_base*)'
sketch_oct31a.cpp.o: In function `std::_Rb_tree_iterator<std::pair<int     const, int> >::operator--()':
c:\users\user\appdata\roaming\arduino15\packages\esp8266\tools\xtensa-lx106-    elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-    elf\include\c++\4.8.2\bits/stl_tree.h:204: undefined reference to     `std::_Rb_tree_decrement(std::_Rb_tree_node_base*)'
sketch_oct31a.cpp.o:    (.text._ZNSt8_Rb_treeIiSt4pairIKiiESt10_Select1stIS2_ESt4lessIiESaIS2_EE29_M_get    _insert_hint_unique_posESt23_Rb_tree_const_iteratorIS2_ERS1_[_ZNSt8_Rb_treeIiSt4    pairIKiiESt10_Select1stIS2_ESt4lessIiESaIS2_EE29_M_get_insert_hint_unique_posESt    23_Rb_tree_const_iteratorIS2_ERS1_]+0x0): undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base*)'
sketch_oct31a.cpp.o: In function `std::_Rb_tree<int, std::pair<int const,     int>, std::_Select1st<std::pair<int const, int> >, std::less<int>,     std::allocator<std::pair<int const, int> >     >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator<std::pair<int     const, int> >, int const&)':
c:\users\user\appdata\roaming\arduino15\packages\esp8266\tools\xtensa-lx106-    elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits/stl_tree.h:1431: undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base*)'
c:\users\user\appdata\roaming\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits/stl_tree.h:1448: undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base*)'
collect2.exe: error: ld returned 1 exit status
Error compiling.

我从这里拿了那个包:https://github.com/esp8266/Arduino

BTW ESP8266的任何其他内容编译好。

提前致谢

2 个答案:

答案 0 :(得分:4)

标准ESP8266设置不链接libstdc ++,后者提供map和其他标准命名空间代码。

您需要在ESP8266 Arudino文件夹的根目录中编辑platforms.txt(此文件夹的位置取决于用于安装它的内容以及您正在使用的操作系统) - 并添加{ {1}}到以下行:

-lstdc++

Arduino IDE 仅在启动时读取此文件一次,因此,请确保在编译之前重新启动IDE。

答案 1 :(得分:0)

如果它仍然不起作用(因为您的工具链中的libstdc ++不完整),请从https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/src/c++98/tree.cc获取源代码并将其重命名为tree.cpp。 这对我有用。