Arduino编译器和STL:使用std::vector和std::map



虽然许多帖子说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 卡塔琳娜 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

也许这可以帮助某人:

你可以在这里找到一个(非常旧的(Arduino IDE的STL端口: https://github.com/maniacbug/StandardCplusplus

测试后注意:好,好,好...那个特定的库有问题(有令人讨厌的错误!特别是在我不想重新发明的类中(。

神秘的是,矢量包含在 esp8266 内核的其他地方,而 map 则没有。 幸运的是,显式包含 map 让我的编译器满意。Arduino IDE 1.8.13,esp8266 Core 3.02,Windows 7 32 位。

对于其他 STL 模板也是如此,例如 std::string、#include

std::vector<int> foo;       // vector 'mysteriously' included elsewhere by esp8266 core
// As suggested by compiler along with 'map' error if map not user included:
//  "note: 'std::map' is defined in header '<map>'; did you forget to '#include <map>'?"
#include <map>              // user must include to use std::map (see above comment)
std::map<int, int> bar;

最新更新