“BangBangControlTest.o 和 BangBangControl.o 中的重复符号 _heating_unit”是什么意思?

问题描述 投票:0回答:1

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

$ 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();
 };

“HeatingUnit.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;
  }
}

“HeatingUnit.h”

#include <iostream>
using namespace std;

class HeatingUnit{
  public:
    bool isOn;
    int temp;

    HeatingUnit();
    HeatingUnit(bool, int);
    void turnOn();
    void turnOff();
    int tick();
};
c++ gcc
1个回答
1
投票

您在头文件中看到了

HeatingUnit heating_unit;
吗? 您需要将
extern
放在它的前面,然后将不带 extern 的原始版本复制到 .cpp 文件中,可以选择在那里指定初始值。

您可以在这里阅读更多相关信息:如何使用 extern 在源文件之间共享变量?

© www.soinside.com 2019 - 2024. All rights reserved.