如何创建全局变量/包含/函数以在多个源文件中使用

时间:2018-01-23 00:52:26

标签: c++ arduino esp8266

我正在为一个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

然后我向#include <globals.h>main.cpp添加了effects.cpp。我的理解是,使用这种结构,这两个文件都可以引用globals.h中声明的相同库和相同的变量。这似乎在很大程度上起作用,但我一直在收到错误的说法,&#34; Blynk&#34;有多个定义(第一次出现在effects.cpp,第二次出现在main.cpp)。我得到同样的错误&#34; leds&#34;。

我还没有定义&#34; Blynk&#34;在我的代码中的任何地方,它都是一个外部库,所以我不确定问题是什么。如果代码全部在一个文件中,那么代码完全正常。我也无法在extern文件CRGB leds[NUM_LEDS];之前使用globals.h因为CRGB不是公认的变量类型。

任何人都可以指出我正确的方向,我做错了什么?

2 个答案:

答案 0 :(得分:2)

您包含的头文件(BlynkSimpleEsp8266.h)在第90到92行包含以下内容

static WiFiClient _blynkWifiClient;
static BlynkArduinoClient _blynkTransport(_blynkWifiClient);
BlynkWifi Blynk(_blynkTransport);

所有这一切看起来都很糟糕。最后一个看起来像是一个给你错误信息的那个。这三行在包含此标头的每个cpp文件中创建对象。它们不应该在头文件中。将它们移动到您的一个cpp文件中。

答案 1 :(得分:0)

将每个cpp文件(编译单元)单独编译为目标文件,然后进行链接。不会在编译单元边界上记住这些定义。所以它可能是链接器多重定义错误。