如何创建用于多个源文件的全局变量/包含/函数
How to create global variables/includes/functions for use in multiple source files
我正在为一个ESP8266开发一个程序,将所有内容都放在一个源文件中有点混乱,所以我决定分解它,但我不确定如何正确构建不同的文件。
我当前的结构是一个包含我的void loop()
和void setup()
的main.cpp
文件,没有包含。然后,我有一个名为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
)。我得到同样的错误"led"。
我没有在我的代码中的任何地方定义"Blynk",它是一个外部库,所以我不确定问题是什么。如果代码全部在一个文件中,则完全按原样工作正常。我也不能在globals.h
文件中CRGB leds[NUM_LEDS];
之前使用extern
,因为 CRGB 不是公认的变量类型。
谁能指出我正确的方向,我做错了什么?
您包含的头文件 (BlynkSimpleEsp8266.h) 在第 90 行到 92 行包含以下内容
static WiFiClient _blynkWifiClient;
static BlynkArduinoClient _blynkTransport(_blynkWifiClient);
BlynkWifi Blynk(_blynkTransport);
所有这些在我看来都是苏斯。最后一个看起来像给你错误消息的那个。这三行在包含此标头的每个 cpp 文件中创建对象。它们不应位于头文件中。将它们移到您的一个 cpp 文件中。
每个 cpp 文件(编译单元)都单独编译到一个对象文件,然后链接。不会跨编译单元边界记住定义。因此,这可能是链接器多个定义错误。
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 如何创建用于多个源文件的全局变量/包含/函数
- 如何从 C++ 源文件访问 C 源文件中的全局变量
- C 细分故障由全局变量在单独的源文件中引起
- 使用全局变量作为在其他源文件中分配的函数的参数
- 如何使用在源文件内的头文件中声明的全局变量
- 多个源文件中的外部全局变量未解决的链接器错误
- 为什么全局变量由另一个源文件中的类初始化
- 从C++源文件创建全局变量列表
- 如何声明和定义全局变量,以便从所有头文件/源文件中正确访问它们
- c++函数在不同的源文件中使用全局变量