Как создать глобальные переменные /include / функции для использования в нескольких исходных файлах
Я работаю над программой для ESP8266, и она становится немного беспорядочной, чтобы все было в одном исходном файле, поэтому я решил разбить ее, но я не уверен, как правильно структурировать различные файлы.
Моя текущая структура main.cpp
файл, который содержит мой void loop()
а также void setup()
, без включает. Затем у меня есть отдельный файл с именем effects.cpp
с функциями, которые будут отличаться светодиодными эффектами, и соответствующим effects.h
файл. Опять не включает. Наконец, у меня есть globals.h
файл, который содержит следующее:
#ifndef GLOBAL_H
#define GLOBAL_H
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <FastLED.h>
#include <BlynkSimpleEsp8266.h> //library for blynk functions
#define NUM_LEDS 150 //Number of LEDs on the strip
#define DATA_PIN D5
#define CLOCK_PIN D6
#define LED_TYPE APA102 //Change this to the chipset of the LED strip you're using
#define BRIGHTNESS 84
extern char auth[]; //stores API token for Blynk
extern int pinValue; //stores state of button from Blynk app
CRGB leds[NUM_LEDS];
#endif
Итак, я добавил #include <globals.h>
как для main.cpp
а также effects.cpp
, Насколько я понимаю, с этой структурой оба этих файла смогут ссылаться на те же библиотеки и те же переменные, что и в globals.h
, Похоже, это работает по большей части, но я продолжаю получать сообщения о том, что "Blynk" имеет несколько определений (первое появление в effects.cpp
второй в main.cpp
). Я получаю ту же ошибку для "светодиодов".
Я нигде не определил "Blynk" в своем коде, это внешняя библиотека, поэтому я не уверен, в чем проблема. Код точно так же, как он работает отлично, если все это в одном файле. Я тоже не могу использовать extern
до CRGB leds[NUM_LEDS];
в моем globals.h
файл, потому что CRGB не является распознанным типом переменной.
Кто-нибудь может указать мне правильное направление, что я делаю не так?
2 ответа
Включаемый заголовочный файл (BlynkSimpleEsp8266.h) содержит следующие строки в строках 90–92.
static WiFiClient _blynkWifiClient;
static BlynkArduinoClient _blynkTransport(_blynkWifiClient);
BlynkWifi Blynk(_blynkTransport);
все из которых кажутся мне подозрительными. Последний выглядит как тот, который выдает сообщение об ошибке. Эти три строки создают объекты в каждом файле cpp, который включает этот заголовок. Их не должно быть в заголовочном файле. Переместите их в один из ваших файлов cpp.
Каждый файл cpp (модуль компиляции) компилируется отдельно в объектный файл и затем связывается. Определения не запоминаются через границы единиц компиляции. Так что это может быть ошибка множественного определения компоновщика.