"duplicate symbol _heating_unit in BangBangControlTest.o and BangBangControl.o"是什么意思?

What does "duplicate symbol _heating_unit in BangBangControlTest.o and BangBangControl.o" mean?

本文关键字:and BangBangControl 是什么 意思 in duplicate symbol heating unit BangBangControlTest      更新时间:2023-10-16

我在尝试编译代码时收到此错误。

$ g++ -o BangBangControlTest BangBangControl.o BangBangControlTest.o ld: duplicate symbol _heating_unit in BangBangControlTest.o and BangBangControl.o for architecture x86_64 collect2: ld returned 1 exit status

我刚接触C++,找不出哪里出了问题。我搜索了许多教程,并查看了其他堆栈用户收到的类似错误消息。这是我的课。"BangBangControlTest.cpp"

// Test function
#include <iostream>
#include "BangBangControl.h"
using namespace std;
int main(){
  BangBangControl control(50, true, 75);
for(int i = 0; i < 50; i++){
std::cout << "Temp = " << control.update() << endl;
}
return 0;
}

"BangBangControl.cpp"

#include <iostream>
#include "BangBangControl.h"
using namespace std;
BangBangControl::BangBangControl(int temp, bool isOn, int initialTemp){
  heating_unit = HeatingUnit(isOn, initialTemp);
  temp_to_maintain = temp;
}
void BangBangControl::setTemp(int temp){temp_to_maintain = temp;}
int BangBangControl::getTemp(){return temp_to_maintain;}
int BangBangControl::update(){
  int b=heating_unit.tick();
  if (b  > temp_to_maintain + 2) heating_unit.turnOff();  if (b  < temp_to_maintain - 2) heating_unit.turnOn();
  return b;
}

"BangBangControl.h"

// BangBangControl header
#include <iostream>
#include "HeatingUnit.h"
using namespace std;
HeatingUnit heating_unit;
int temp_to_maintain;
class BangBangControl{
 public:
   BangBangControl(int, bool, int);
    void setTemp(int);
    int getTemp();
    int update();
 };

"加热装置.cpp"

// HeatingUnit class implementation
#include <iostream>
#include "HeatingUnit.h"
using namespace std;
HeatingUnit::HeatingUnit(bool a, int b){
  isOn = a;
  temp = b;
}
void HeatingUnit::turnOn(){isOn = true;}
void HeatingUnit::turnOff(){isOn = false;}
int HeatingUnit::tick(){
  if(isOn && temp <= 100){
    return ++temp;
}
  else if((!isOn) && temp >= 0){
    return --temp;
  }
  else{
    return temp;
  }
}

"加热装置.h"

#include <iostream>
using namespace std;
class HeatingUnit{
  public:
    bool isOn;
    int temp;
    HeatingUnit();
    HeatingUnit(bool, int);
    void turnOn();
    void turnOff();
    int tick();
};

您在头文件中看到HeatingUnit heating_unit;了吗?您需要将extern放在它前面,并将不带extern的原始版本复制到.cpp文件中,可以选择在其中指定一个初始值。

您可以在这里阅读更多关于这方面的内容:如何使用extern在源文件之间共享变量?