Я использую Arduino IDE и планирую позже перейти на решение VSCode/Makefile.
У меня есть проект, который компилируется и работает нормально, если весь код принадлежит основному скетчу. Как только я отделяю код, шаг связывания завершается неудачей.
Я свел это к простой демонстрации:
#ifdef __cplusplus
extern "C" {
#endif
void methodCall();
#ifdef __cplusplus
}
#endif
void setup() {
// put your setup code here, to run once:
}
void loop() {
methodCall();
}
void methodCall() {
random(0,1);
}
#ifdef __cplusplus
extern "C" {
#endif
void methodCall();
#ifdef __cplusplus
}
#endif
void setup() {
// put your setup code here, to run once:
}
void loop() {
methodCall();
}
void methodCall() {
random(0,1);
}
Некоторые вопросы предполагают добавление -lstd++
к строке compiler.c.elf.libs
в файле platform.txt папки ESP8266, но, похоже, это не дает никакого результата для меня, и, кроме того, предыдущая строка build.stdcpp_lib=-lstdc++
, кажется, позаботится об этом.
Ошибки идентичны, если объявление метода вынесено в заголовочный файл #include
d исходными файлами. Функция random
объявлена в esp8266/Arduino.h и определена здесь.
Что я делаю не так?
Согласно https://github.com/esp8266/Arduino/issues/1283, где Links2004 утверждает:
random — это API-функция от Arduino. не работает на С
ответ, кажется, состоит в том, чтобы заменить звонки на замену звонков на random
на звонки на rand
. Тестирование показывает, что как в этом демонстрационном исходном коде, так и в реальном исходном коде замена random()
и randomSeed
на модификации на основе rand
и srand
компилируется и работает правильно.
Если у кого-то есть лучший вариант, который позволяет использовать функцию C++ random
из кода C, я с радостью заменю свое «решение» на их. Меня расстраивает, что код C, замаскированный Arduino под C++, компилируется, но один и тот же исходный код, разделенный на несколько файлов, не компилируется и требует, чтобы сам исходный код вызывал разные функции.