Как избежать множественной ошибки определения «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 во второй или третий модуль без ошибок с несколькими определениями? Редактирование файла заголовка/библиотеки невозможно!

По вопросу Как создавать глобальные переменные/включаемые функции/функции для использования в нескольких исходных файлах до сих пор неясно, что именно рабочее решение - это...

, 👍0

Обсуждение

Вся магия «возможного дубликата» заключается в ключевом слове extern в заголовочном файле, и экземпляр должен быть определен в файле .cpp (без extern). extern означает, что эта переменная размещена где-то еще., @KIIV

Вы хотите включить заголовок, который НЕ МОЖЕТ быть включен более чем в один файл cpp, в более чем один файл cpp без каких-либо изменений в этом файле заголовка. Вы можете подумать, что мы не читаем ваш вопрос, но это просто потому, что нет другого способа, кроме как исправить библиотеку с помощью extern., @KIIV


1 ответ


Лучший ответ:

4

Простые заголовочные файлы 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