如何创建全局 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.cppeffects.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文件(编译单元)单独编译成目标文件,然后链接。这些定义不会跨编译单元边界被记住。所以它可能是链接器多重定义错误。