А зачем? У ESP итак с памятью беда (RAM), её мало, а если писать на C++ то расход памяти увеличиться => сами угадайте что будет.Кто-то заморачивался с написанием кода на С++?
И компилятора C++ нет, он был у меня в X64 сборки DevKit v1.0.4, но сейчас я x64 не буду собирать и как следствие с++ компилятора не будет. Да и не нужен он, см. выше почему.Собственно, сам компилятор для него есть в SDK. Но либы, похоже, есть только для С.
Возможно, но китайские разработчики иного мнения, как следствие сидим на том что есть.Насчет расхода памяти - не такая и большая разница что по флешу, что по оперативке. Зато писать на плюсах гораздо проще и приятнее.
Я заморачивался. igrr заморачивался.Собственно, сам компилятор для него есть в SDK. Но либы, похоже, есть только для С.
Кто-то заморачивался с написанием кода на С++?
Я вижу, что вы в конструкторе A::A() статического объекта a выводите в UART, до вызова uart_init.1. Почему-то вывод в последовательный порт в функции user_init происходит на неправильной скорости. Возможно, уарт не успевает перестроить скорость. Но через секунду по таймеру все выводится правильно.
А вы включите -W -Wall и увидите, что ниоткуда он их не берёт и ругается тихонько. Для С++ прототипы придётся писать, да. В крайнем случае можно седом сделать затычки вида void f(...) из файла eagle.rom.addr.v6.ld2. Не хватает хедеров для библиотечных функций, таких как os_timer_disarm, os_timer_setfn, ets_timer_arm_new, и т.д. Так же непонятно откуда компилятор берет их определения в исходном примере hello_world. Ведь пример компилируется успешно...
Нет, в конструкторе я только инициализирую поля. Этот класс всего лишь для проверки инициализации глобальных объектов. Проверка показала, что таки, их надо инициализировать ручками. Вывод в нем только в методе print.Я вижу, что вы в конструкторе A::A() статического объекта a выводите в UART, до вызова uart_init.
Вот оно что... Об этом я не подумал.А вы включите -W -Wall и увидите, что ниоткуда он их не берёт и ругается тихонько. Для С++ прототипы придётся писать, да. В крайнем случае можно седом сделать затычки вида void f(...) из файла eagle.rom.addr.v6.ld
М... ТочнякНет, в конструкторе я только инициализирую поля. Этот класс всего лишь для проверки инициализации глобальных объектов. Проверка показала, что таки, их надо инициализировать ручками. Вывод в нем только в методе print.
c:\espressif\xtensa-lx106-elf\xtensa-lx106-elf\include\c++\4.8.2\bits/vector.tcc:344: undefined reference to `__dso_handle'
c:/Espressif/ESP8266_SDK/lib\libc.a(mallocr.o):(.literal+0x14): undefined reference to `_sbrk_r'
c:/Espressif/ESP8266_SDK/lib\libc.a(mallocr.o): In function `_malloc_r':
\build\tree\RC-2010.1_kuma\p4root\Xtensa\Target-libs\newlib\newlib\libc\stdlib/mallocr.c:2152: undefined reference to `_sbrk_r'
\build\tree\RC-2010.1_kuma\p4root\Xtensa\Target-libs\newlib\newlib\libc\stdlib/mallocr.c:2189: undefined reference to `_sbrk_r'
c:/Espressif/ESP8266_SDK/lib\libc.a(freer.o): In function `_malloc_trim_r':
\build\tree\RC-2010.1_kuma\p4root\Xtensa\Target-libs\newlib\newlib\libc\stdlib/mallocr.c:3309: undefined reference to `_sbrk_r'
\build\tree\RC-2010.1_kuma\p4root\Xtensa\Target-libs\newlib\newlib\libc\stdlib/mallocr.c:3351: undefined reference to `_sbrk_r'
c:/Espressif/ESP8266_SDK/lib\libc.a(freer.o):\build\tree\RC-2010.1_kuma\p4root\Xtensa\Target-libs\newlib\newlib\libc\stdlib/mallocr.c:3327: more undefined references to `_sbrk_r' follow
c:/espressif/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: build/httpd.out: hidden symbol `__dso_handle' isn't defined
c:/espressif/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: final link failed: Bad value
И они определены как?New и delete у меня определены в одном из cpp файлов.
DSO == Dynamic Shared Object. Похоже, что кто-то неправильно собрал компилятор.И непонятно откуда вылезло __dso_handle...
И они определены как?
void *operator new(size_t size)
{
return os_malloc(size);
}
void *operator new[](size_t size)
{
return os_malloc(size);
}
void operator delete(void * ptr)
{
os_free(ptr);
}
void operator delete[](void * ptr)
{
os_free(ptr);
}
У меня под линуксом ваш пример и так отлично собирается.Нашел закономерность.
Такое происходит если объект вектора глобальный... Или находится в глобальном объекте.
Вот еще одно подтверждение тому, что глобальные объекты - зло )))
Пример в аттаче.
Если объект "а" объявить локально в функции user_main - то все собирается отлично...
Пока у вас вылезает __dso_handle большого смысла разбираться со всем остальным нет. Что вам выводит xtensa-lx106-elf-g++ -v ?Продолжаем исследования. ... Осталось понять как деструктор влияет на использование библиотечных функций _malloc_r, _malloc_trim_r, _sbrk_r и __dso_handle