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

时间:2012-02-24 01:48:28

标签: c++ gcc compiler-construction

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

$ 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;

}

&#34; BangBangControl.cpp&#34;

#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;
}

&#34; BangBangControl.h&#34;

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

&#34; HeatingUnit.cpp&#34;

// 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;
  }
}

&#34; HeatingUnit.h&#34;

#include <iostream>
using namespace std;

class HeatingUnit{
  public:
    bool isOn;
    int temp;

    HeatingUnit();
    HeatingUnit(bool, int);
    void turnOn();
    void turnOff();
    int tick();
};

1 个答案:

答案 0 :(得分:1)

您在头文件中看到HeatingUnit heating_unit;?您需要将extern放在它前面,并将没有extern的原始版本复制到.cpp文件中,可选择在那里指定初始值。

您可以在此处详细了解:How do I use extern to share variables between source files?