我正在为一个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不是公认的变量类型。
任何人都可以指出我正确的方向,我做错了什么?
答案 0 :(得分:2)
您包含的头文件(BlynkSimpleEsp8266.h)在第90到92行包含以下内容
static WiFiClient _blynkWifiClient;
static BlynkArduinoClient _blynkTransport(_blynkWifiClient);
BlynkWifi Blynk(_blynkTransport);
所有这一切看起来都很糟糕。最后一个看起来像是一个给你错误信息的那个。这三行在包含此标头的每个cpp文件中创建对象。它们不应该在头文件中。将它们移动到您的一个cpp文件中。
答案 1 :(得分:0)
将每个cpp文件(编译单元)单独编译为目标文件,然后进行链接。不会在编译单元边界上记住这些定义。所以它可能是链接器多重定义错误。