我如何避免“ ...”的“多重定义”。在这种情况下错误

发布于 2025-01-17 11:16:31 字数 812 浏览 5 评论 0原文

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

这是我尝试过的:

  • 创建一个额外的头文件并在顶部添加 #pragma Once
  • 创建一个额外的 Lib 并添加典型的 #ifndef ; #定义; #endif

你有解决这个问题的想法吗? 我没有多次定义“disp”。仅在一个标题中。

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^^
...

Error:

.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

Here is what I tried:

  • make an extra Header-File and add #pragma once at the top
  • make an extra Lib and add the typical #ifndef; #define; #endif lines

Do you have some ideas to fix this problem?
I don't define 'disp' multiple times. Just in one Header.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

看轻我的陪伴 2025-01-24 11:16:31

问题出在这里:

#ifndef BOARDCOMPUTER_H
#define BOARDCOMPUTER_H

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

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

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

这种情况发生在这里:

  • 您将 Boardcomputer.h 包含在 foo.c 中,因此 foo.o 将包含一个变量 disp >。代码编译良好。
  • 您将 Boardcomputer.h 包含在 bar.c 中,因此 bar.o 将包含变量 disp。代码编译良好。
  • 您链接 foo.obar.o 以生成可执行文件,链接器会看到两个变量 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
...

The problem is here:

#ifndef BOARDCOMPUTER_H
#define BOARDCOMPUTER_H

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

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

You define disp in a header file. Defining variables in header files is plain wrong, it cannot work (except if you include the .h file in a single .c file, but then the .h file is pretty pointless anyway) and it leads to these "multiple definition" issues at link time.

This happens here:

  • you include Boardcomputer.h in foo.c, therefore foo.o will contain a variable disp. The code compile fine.
  • you include Boardcomputer.h in bar.c, therefore bar.o will contain a variable disp. The code compile fine.
  • you link foo.o and bar.o in order to produce an executable, and the linker sees two variables disp, one in bar.o and one in foo.o, hence the multiple definition error

You want this:

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
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文