【问题标题】:Global variables not allowed in headers? [duplicate]标题中不允许使用全局变量? [复制]
【发布时间】:2021-05-22 16:47:34
【问题描述】:

我正在尝试为我的 PlatformIO Arduino 项目使用单独的文件,但出现此错误:

.pio/build/uno/src/test.cpp.o (symbol from plugin): In function `value':
(.text+0x0): multiple definition of `value'
.pio/build/uno/src/main.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2: error: ld returned 1 exit status

对我来说,如果您没有包含保护或使用 pragma 一次,则此错误听起来像是您会遇到的错误,但它们并没有解决我的问题。

这是我的 main.cpp:

#include <Arduino.h>
#include "test.hpp"

void setup() {
  Serial.begin(115200);
  Serial.println(value);
}

void loop() {
}

test.hpp:

#ifndef TEST_HPP
#define TEST_HPP

int value = 3;

#endif

test.cpp 只包含 test.hpp,不做其他任何事情。

【问题讨论】:

标签: c++ arduino platformio


【解决方案1】:

您的项目中似乎有两个源文件:main.cpptest.cpp。两者都可能包括 test.hpp。所以现在每个源文件都独立地选择了一个value 变量。所以链接器会感到困惑,因为它不知道每个模块应该使用哪个value。而且您可能不想要这个全局变量的多个实例。你只想要一个。

改为在 test.hpp 中执行此操作:

extern int value;

然后在test.cpp中:

int value = 3;

【讨论】:

  • 自从我上次用纯 C++ 编写更大的东西已经有一段时间了,但我想我从来没有遇到过问题。 Arduinos C++ 有什么不同吗?
  • 不。这种行为是从 C 继承而来的。几十年来没有改变。
  • 不是 C++ 编译器有问题,而是链接器。某些链接器可能具有命令行选项,如果它看到多个符号定义或只是给出警告,则只能“选择一个”。但实际上,你真的不想在头文件中定义变量,只需声明它们即可。
  • 感谢您的解释
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多