【问题标题】:Arduino compiler and STL: Using std::vector and std::mapArduino 编译器和 STL:使用 std::vector 和 std::map
【发布时间】:2020-06-06 03:40:05
【问题描述】:

虽然许多帖子说 STL 库通常不适用于 arduino/嵌入式系统,但它们似乎安装在我的 Arduino 编译器上!还有很多工作。

问题:(显示完整草图)

std::vector<int> foo;         // this works fine
std::map<int,int> bar;    // adding this gives an error

void setup() {}
void loop() {}


sketch_jun05a:4:1: error: 'map' in namespace 'std' does not name a type
 std::map<int,int> bar;
 ^

所以我不知道为什么 std::vector 会起作用,但 std::map 不起作用。

编译器平台:Mac OSX Catalina 上的 Ardunio.app 1.8.12 目标:ESP8266

下面贴有详细的错误信息。

分析:
我在我的 arduino 应用程序中搜索了 map.h,发现了一个看起来很广泛的 STL 库类,包括 stl_map.h

这些位于我的系统上的以下路径:

~/Library/Arduino15/packages//esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/xtensa-lx106-elf/include/c++/4.8.2

and most of the interesting looking headers are in a subdir called "bits".

另一个奇怪的事情是 std::vector 在不包含任何头文件的情况下工作。这出乎我的意料。

我没有配置我的搜索路径或设置任何环境变量,所以无论安装 Arduino 应用程序做什么都是它正在搜索的路径。

我也找不到这方面的任何文档。
我发现的所有内容都表明 Arduino/ESP8266 没有 STL!我确实找到了一些名为 ArduinoSTL 和 avr_stl 的 gitbub 项目库,之前我确实将它们安装为本地用户库(不在系统库中),但我没有在上面的草图中导入它们。

这是完整的错误信息:

/Applications/Arduino.app/Contents/Java/arduino-builder -dump-prefs -logger=machine -hardware /Applications/Arduino.app/Contents/Java/hardware -hardware /Users/cems/Library/Arduino15/packages -tools /Applications/Arduino.app/Contents/Java/tools-builder -tools /Applications/Arduino.app/Contents/Java/hardware/tools/avr -tools /Users/cems/Library/Arduino15/packages -built-in-libraries /Applications/Arduino.app/Contents/Java/libraries -libraries /Users/cems/Documents/Arduino/libraries -fqbn=esp8266:esp8266:d1:xtal=80,vt=flash,exception=legacy,ssl=all,eesz=4M2M,ip=lm2f,dbg=Disabled,lvl=None____,wipe=none,baud=3000000 -vid-pid=1A86_7523 -ide-version=10812 -build-path /var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707 -warnings=none -build-cache /var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_cache_761223 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.xtensa-lx106-elf-gcc.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506 -prefs=runtime.tools.xtensa-lx106-elf-gcc-2.5.0-4-b40a506.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506 -prefs=runtime.tools.mkspiffs.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/mkspiffs/2.5.0-4-b40a506 -prefs=runtime.tools.mkspiffs-2.5.0-4-b40a506.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/mkspiffs/2.5.0-4-b40a506 -prefs=runtime.tools.python3.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/python3/3.7.2-post1 -prefs=runtime.tools.python3-3.7.2-post1.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/python3/3.7.2-post1 -prefs=runtime.tools.mklittlefs.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/mklittlefs/2.5.0-4-fe5bb56 -prefs=runtime.tools.mklittlefs-2.5.0-4-fe5bb56.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/mklittlefs/2.5.0-4-fe5bb56 -verbose /Users/cems/Documents/Arduino/sketch_jun05a/sketch_jun05a.ino
/Applications/Arduino.app/Contents/Java/arduino-builder -compile -logger=machine -hardware /Applications/Arduino.app/Contents/Java/hardware -hardware /Users/cems/Library/Arduino15/packages -tools /Applications/Arduino.app/Contents/Java/tools-builder -tools /Applications/Arduino.app/Contents/Java/hardware/tools/avr -tools /Users/cems/Library/Arduino15/packages -built-in-libraries /Applications/Arduino.app/Contents/Java/libraries -libraries /Users/cems/Documents/Arduino/libraries -fqbn=esp8266:esp8266:d1:xtal=80,vt=flash,exception=legacy,ssl=all,eesz=4M2M,ip=lm2f,dbg=Disabled,lvl=None____,wipe=none,baud=3000000 -vid-pid=1A86_7523 -ide-version=10812 -build-path /var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707 -warnings=none -build-cache /var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_cache_761223 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.xtensa-lx106-elf-gcc.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506 -prefs=runtime.tools.xtensa-lx106-elf-gcc-2.5.0-4-b40a506.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506 -prefs=runtime.tools.mkspiffs.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/mkspiffs/2.5.0-4-b40a506 -prefs=runtime.tools.mkspiffs-2.5.0-4-b40a506.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/mkspiffs/2.5.0-4-b40a506 -prefs=runtime.tools.python3.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/python3/3.7.2-post1 -prefs=runtime.tools.python3-3.7.2-post1.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/python3/3.7.2-post1 -prefs=runtime.tools.mklittlefs.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/mklittlefs/2.5.0-4-fe5bb56 -prefs=runtime.tools.mklittlefs-2.5.0-4-fe5bb56.path=/Users/cems/Library/Arduino15/packages/esp8266/tools/mklittlefs/2.5.0-4-fe5bb56 -verbose /Users/cems/Documents/Arduino/sketch_jun05a/sketch_jun05a.ino
Using board 'd1' from platform in folder: /Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1
Using core 'esp8266' from platform in folder: /Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1
Detecting libraries used...
/Users/cems/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/xtensa-lx106-elf-g++ -D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/tools/sdk/include -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/tools/sdk/lwip2/include -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/tools/sdk/libc/xtensa-lx106-elf/include -I/var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707/core -c -w -Os -g -mlongcalls -mtext-section-literals -fno-rtti -falign-functions=4 -std=gnu++11 -ffunction-sections -fdata-sections -fno-exceptions -w -x c++ -E -CC -DNONOSDK22x_190703=1 -DF_CPU=80000000L -DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DARDUINO=10812 -DARDUINO_ESP8266_WEMOS_D1R1 -DARDUINO_ARCH_ESP8266 "-DARDUINO_BOARD=\"ESP8266_WEMOS_D1R1\"" -DFLASHMODE_DIO -DESP8266 -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/cores/esp8266 -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/variants/d1 /var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707/sketch/sketch_jun05a.ino.cpp -o /dev/null
Generating function prototypes...
/Users/cems/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/xtensa-lx106-elf-g++ -D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/tools/sdk/include -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/tools/sdk/lwip2/include -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/tools/sdk/libc/xtensa-lx106-elf/include -I/var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707/core -c -w -Os -g -mlongcalls -mtext-section-literals -fno-rtti -falign-functions=4 -std=gnu++11 -ffunction-sections -fdata-sections -fno-exceptions -w -x c++ -E -CC -DNONOSDK22x_190703=1 -DF_CPU=80000000L -DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DARDUINO=10812 -DARDUINO_ESP8266_WEMOS_D1R1 -DARDUINO_ARCH_ESP8266 "-DARDUINO_BOARD=\"ESP8266_WEMOS_D1R1\"" -DFLASHMODE_DIO -DESP8266 -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/cores/esp8266 -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/variants/d1 /var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707/sketch/sketch_jun05a.ino.cpp -o /var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707/preproc/ctags_target_for_gcc_minus_e.cpp
/Applications/Arduino.app/Contents/Java/tools-builder/ctags/5.8-arduino11/ctags -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives /var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707/preproc/ctags_target_for_gcc_minus_e.cpp
Compiling sketch...
/Users/cems/Library/Arduino15/packages/esp8266/tools/python3/3.7.2-post1/python3 /Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/tools/signing.py --mode header --publickey /Users/cems/Documents/Arduino/sketch_jun05a/public.key --out /var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707/core/Updater_Signing.h
/Users/cems/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/xtensa-lx106-elf-g++ -D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/tools/sdk/include -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/tools/sdk/lwip2/include -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/tools/sdk/libc/xtensa-lx106-elf/include -I/var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707/core -c -w -Os -g -mlongcalls -mtext-section-literals -fno-rtti -falign-functions=4 -std=gnu++11 -MMD -ffunction-sections -fdata-sections -fno-exceptions -DNONOSDK22x_190703=1 -DF_CPU=80000000L -DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -DARDUINO=10812 -DARDUINO_ESP8266_WEMOS_D1R1 -DARDUINO_ARCH_ESP8266 "-DARDUINO_BOARD=\"ESP8266_WEMOS_D1R1\"" -DFLASHMODE_DIO -DESP8266 -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/cores/esp8266 -I/Users/cems/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.1/variants/d1 /var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707/sketch/sketch_jun05a.ino.cpp -o /var/folders/py/rycjfnrd0t13_pm4d11yyd2m0000gn/T/arduino_build_263707/sketch/sketch_jun05a.ino.cpp.o
sketch_jun05a:4:1: error: 'stl_map' in namespace 'std' does not name a type
 std::stl_map<int,int> bar;
 ^
exit status 1
'stl_map' in namespace 'std' does not name a type

【问题讨论】:

  • 向我们展示一个尝试使用 std::map 的完整文件,其中包含 #includes 和所有文件。另外,如果您要描述要使用 std::map 解决的问题,那将有很大帮助。我敢打赌会有更好的解决方案。
  • @JohnZwinck 这里的问题是 STL 在 ESP8266(Arduino 编译器)中是否可用?如果它是关于这个的文档在哪里?至于解决任何特定用例,有很多方法可以滚动您自己的 map() 类,但如果有一个可用的 STL,则可以轻松使用很多代码端口。我只是使用 map() 案例来表明显然有些 STL 不存在而有些存在。这很奇怪,因为 ESP8266 库似乎同时包含矢量和地图。那么为什么不编译 map() 而 vector() 编译呢?

标签: c++ arduino stl arduino-esp8266


【解决方案1】:

也许这可以帮助某人:

您可以在此处找到适用于 Arduino IDE 的(非常旧的)STL 端口: https://github.com/maniacbug/StandardCplusplus

测试后的注意事项:嗯,嗯,嗯......那个特定的库是错误的(有令人讨厌的错误!尤其是在我不想重新发明的类中)。

【讨论】:

  • 它还能用吗?它会破坏其他使用 stdlib 的东西并期待其他一些 stdlib 吗?
  • @Alexander 就std::bitset&lt;&gt; 而言,这不是开箱即用的..
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 2013-10-12
  • 1970-01-01
  • 2020-08-20
相关资源
最近更新 更多