Как избежать множественной ошибки определения «Blynk»?
Включая
#include <BlynkSimpleEsp8266.h>
Библиотека Blynk (https://github.com/blynkkk/blynk-library) из более чем 1 модуля/ cpp, во время компиляции выдается ошибка «Множественное определение `Blynk'». Заголовочный файл содержит следующее:
static WiFiClient _blynkWifiClient;
static BlynkArduinoClient _blynkTransport(_blynkWifiClient);
BlynkWifi Blynk(_blynkTransport);
Как я могу поместить объявления Blynk во второй или третий модуль без ошибок с несколькими определениями? Редактирование файла заголовка/библиотеки невозможно!
По вопросу Как создавать глобальные переменные/включаемые функции/функции для использования в нескольких исходных файлах до сих пор неясно, что именно рабочее решение - это...
@partinis, 👍0
Обсуждение1 ответ
Лучший ответ:
Простые заголовочные файлы Blynk не готовы к включению в несколько файлов cpp. Они предназначены для включения только в основной INO-файл. Причина в том, что распределение переменных находится в файле заголовков, что является плохой практикой для C и C++. Файлы h должны содержать только объявления. Правильный путь:
extern BlynkWifi Blynk;
и строки, которые сейчас находятся в файле h, должны попасть в файл cpp. Тогда каждый файл cpp, содержащий расширение .h, будет знать о переменных, но переменные будут выделены только один раз.
Исправление состоит в том, чтобы изменить библиотеку или скопировать включение BlynkSimpleEsp8266.h в ваш проект, например, MyBlynk.h, изменить переменную Blynk в MyBlynk.h на extern
и добавить MyBlynk. cpp-файл с распределением переменных
#include "MyBlynk.h"
WiFiClient _blynkWifiClient;
BlynkArduinoClient _blynkTransport(_blynkWifiClient);
BlynkWifi Blynk(_blynkTransport);
Насколько хорош Блинк — и это так; Я использую его для многих своих проектов — и хотя он активно поддерживается и совершенствуется, эта проблема так и осталась неисправленной. Это один из немногих недостатков в невероятно полезном проекте., @JRobert
это компромисс. поэтому его называют «простым». они не могут создать для этого cpp, потому что сборщик попытается скомпилировать весь cpp для разных сетевых библиотек и архитектур плат. они могли бы создавать ifdef для архитектур, но не для библиотек., @Juraj
- Передача функции-члена класса в качестве аргумента
- контент» не захватывается
- esp32 Stack canary watchpoint срабатывает
- Преобразование byte* в int в Arduino
- Как передать нестатический член класса в обратный вызов?
- ESP8266: ошибка: 'getLocalTime' was not declared in this scope
- Какова цель F() и FPSTR() в ESP8266WebServer -> FSBrowser?
- Веб-сервер ESP8266 не отвечает (тайм-аут подключения)
Вся магия «возможного дубликата» заключается в ключевом слове extern в заголовочном файле, и экземпляр должен быть определен в файле .cpp (без extern). extern означает, что эта переменная размещена где-то еще., @KIIV
Вы хотите включить заголовок, который НЕ МОЖЕТ быть включен более чем в один файл cpp, в более чем один файл cpp без каких-либо изменений в этом файле заголовка. Вы можете подумать, что мы не читаем ваш вопрос, но это просто потому, что нет другого способа, кроме как исправить библиотеку с помощью extern., @KIIV