在这种情况下如何避免 "multiple definition of ..." 错误

How do I avoid the "multiple definition of ..." Error in this case

Boardcomputer.h:

#ifndef BOARDCOMPUTER_H
#define BOARDCOMPUTER_H

#include <Arduino.h>
#include <TFT_eSPI.h>

TFT_eSPI disp = TFT_eSPI();

...

#endif

Boardcomputer.cpp:

#include <Boardcomputer.h>

^^use disp functions^^
...

错误:

.pio\build\EmmaChip\lib782\libBoardcomputer.a(Boardcomputer.cpp.o):(.bss.disp+0x0): multiple definition of `disp'
.pio\build\EmmaChip\src\main.cpp.o:(.bss.disp+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\EmmaChip\firmware.elf] Error 1

这是我尝试过的:

你有解决这个问题的想法吗? 我没有多次定义 'disp' 。就在一个 Header.

问题在这里:

#ifndef BOARDCOMPUTER_H
#define BOARDCOMPUTER_H

#include <Arduino.h>
#include <TFT_eSPI.h>

TFT_eSPI disp = TFT_eSPI();    
...    
#endif

您在头文件中定义 disp。在头文件中定义变量是完全错误的,它无法工作(除非您将 .h 文件包含在单个 .c 文件中,但是 .h 文件无论如何都是毫无意义的)并且它会导致这些“多重定义”问题link次。

这发生在这里:

  • 您在 foo.c 中包含 Boardcomputer.h,因此 foo.o 将包含一个变量 disp。代码编译正常。
  • 您在 bar.c 中包含 Boardcomputer.h,因此 bar.o 将包含一个变量 disp。代码编译正常。
  • 你 link foo.obar.o 以生成可执行文件,linker 看到两个变量 disp,一个在 bar.ofoo.o 中的一个,因此 多重定义 错误

你想要这个:

Boardcomputer.h

#ifndef BOARDCOMPUTER_H
#define BOARDCOMPUTER_H

#include <Arduino.h>
#include <TFT_eSPI.h>

extern TFT_eSPI disp;     // declare it here
    
#endif

Boardcomputer.c

#include "Boardcomputer.h"
...
TFT_eSPI disp = TFT_eSPI();   // define it here
...