在这种情况下如何避免 "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
这是我尝试过的:
- 多做一个Header-File并在顶部添加
#pragma once
- 创建一个额外的库并添加典型的
#ifndef; #define; #endif
行
你有解决这个问题的想法吗?
我没有多次定义 '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.o
和 bar.o
以生成可执行文件,linker 看到两个变量 disp
,一个在 bar.o
和 foo.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
...
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
这是我尝试过的:
- 多做一个Header-File并在顶部添加
#pragma once
- 创建一个额外的库并添加典型的
#ifndef; #define; #endif
行
你有解决这个问题的想法吗? 我没有多次定义 '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.o
和bar.o
以生成可执行文件,linker 看到两个变量disp
,一个在bar.o
和foo.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
...