如何创建全局 variables/includes/functions 以用于多个源文件
How to create global variables/includes/functions for use in multiple source files
我正在为 ESP8266 开发一个程序,将所有内容都放在一个源文件中会变得有点混乱,所以我决定将其分解,但我不确定如何正确构建不同的文件。
我当前的结构是一个 main.cpp
文件,其中包含我的 void loop()
和 void setup()
,但没有包含。然后,我有一个名为 effects.cpp
的单独文件,其中包含不同 LED 效果的功能,以及一个相应的 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
然后我在 main.cpp
和 effects.cpp
中添加了一个 #include <globals.h>
。我的理解是,使用这种结构,这两个文件都可以引用与 globals.h
中声明的相同的库和相同的变量。这似乎在大多数情况下都有效,但我不断收到错误消息,指出 "Blynk" 有多个定义(第一次出现在 effects.cpp
中,第二次出现在 main.cpp
中)。 "leds" 我得到同样的错误。
我没有在我的代码中的任何地方定义 "Blynk",它是一个外部库,所以我不确定问题出在哪里。如果所有代码都在一个文件中,那么代码就可以正常工作。我也不能在 globals.h
文件中的 CRGB leds[NUM_LEDS];
之前使用 extern
,因为 CRGB 不是可识别的变量类型。
谁能指出我正确的方向,我做错了什么?
您包含的 header 文件 (BlynkSimpleEsp8266.h) 在第 90 到 92 行包含以下内容
static WiFiClient _blynkWifiClient;
static BlynkArduinoClient _blynkTransport(_blynkWifiClient);
BlynkWifi Blynk(_blynkTransport);
所有这些在我看来都很糟糕。最后一个看起来像给你错误信息的那个。这三行在包含此 header 的每个 cpp 文件中创建 objects。它们不应该在 header 文件中。将它们移动到您的一个 cpp 文件中。
每个cpp文件(编译单元)单独编译成目标文件,然后链接。这些定义不会跨编译单元边界被记住。所以它可能是链接器多重定义错误。
我正在为 ESP8266 开发一个程序,将所有内容都放在一个源文件中会变得有点混乱,所以我决定将其分解,但我不确定如何正确构建不同的文件。
我当前的结构是一个 main.cpp
文件,其中包含我的 void loop()
和 void setup()
,但没有包含。然后,我有一个名为 effects.cpp
的单独文件,其中包含不同 LED 效果的功能,以及一个相应的 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
然后我在 main.cpp
和 effects.cpp
中添加了一个 #include <globals.h>
。我的理解是,使用这种结构,这两个文件都可以引用与 globals.h
中声明的相同的库和相同的变量。这似乎在大多数情况下都有效,但我不断收到错误消息,指出 "Blynk" 有多个定义(第一次出现在 effects.cpp
中,第二次出现在 main.cpp
中)。 "leds" 我得到同样的错误。
我没有在我的代码中的任何地方定义 "Blynk",它是一个外部库,所以我不确定问题出在哪里。如果所有代码都在一个文件中,那么代码就可以正常工作。我也不能在 globals.h
文件中的 CRGB leds[NUM_LEDS];
之前使用 extern
,因为 CRGB 不是可识别的变量类型。
谁能指出我正确的方向,我做错了什么?
您包含的 header 文件 (BlynkSimpleEsp8266.h) 在第 90 到 92 行包含以下内容
static WiFiClient _blynkWifiClient;
static BlynkArduinoClient _blynkTransport(_blynkWifiClient);
BlynkWifi Blynk(_blynkTransport);
所有这些在我看来都很糟糕。最后一个看起来像给你错误信息的那个。这三行在包含此 header 的每个 cpp 文件中创建 objects。它们不应该在 header 文件中。将它们移动到您的一个 cpp 文件中。
每个cpp文件(编译单元)单独编译成目标文件,然后链接。这些定义不会跨编译单元边界被记住。所以它可能是链接器多重定义错误。