我是C ++的新手,从Java转换到我上大学的课程。在我们的第一个作业中,我们必须为代码编写几个makefile。我的第一个makefile不工作 - 它总是抱怨“TempControlTest中的错误:对'BangBangControl :: XXXX'的未定义引用,其中XXXX是BangBangControl中的一个函数(我在BangBangControl中的每个函数都有错误)。我一直在寻找在线和所有的makefile示例看起来略有不同,所以我不知道我做错了什么。我会在下面发布我的所有代码,如果有人能给我一点帮助,那就太棒了。另外,这个今晚到期,所以任何快速的帮助都非常值得赞赏。如果你还在这里,非常感谢!
HeatingUnit.h:
#ifndef HEATINGUNIT_H
#define HEATINGUNIT_H
class HeatingUnit {
private:
bool on;
int temp;
public:
HeatingUnit(bool o, int t);
void turnOn();
void turnOff();
int tick();
};
#endif
HeatingUnit.cpp:
#include "HeatingUnit.h"
HeatingUnit::HeatingUnit(bool o, int t) {
on = o;
temp = t;
}
void HeatingUnit::turnOn() {
on = true;
}
void HeatingUnit::turnOff() {
on = false;
}
int HeatingUnit::tick() {
if(on) return ++temp + 1;
else return --temp;
}
BangBangControl.h:
#ifndef BANGBANGCONTROL_H
#define BANGBANGCONTROL_H
#include "HeatingUnit.h"
class BangBangControl {
private:
int tempToKeep;
HeatingUnit unit;
public:
BangBangControl(int ttk, bool on, int initTemp);
void setTemp(int t);
int getTemp();
void update();
};
#endif
BangBangControl.cpp:
#include "HeatingUnit.h"
#include "BangBangControl.h"
BangBangControl::BangBangControl(int ttk, bool on, int initTemp)
: unit(on, initTemp) {
tempToKeep = ttk;
}
void BangBangControl::setTemp(int t) {
tempToKeep = t;
}
int BangBangControl::getTemp() {
return tempToKeep;
}
void BangBangControl::update() {
int currentTemp = unit.tick();
if(currentTemp > tempToKeep + 2) unit.turnOff();
else if(currentTemp < tempToKeep - 2) unit.turnOn();
}
TempControlTest.cpp:
include <iostream>
#include "BangBangControl.h"
using namespace std;
int main() {
BangBangControl bang(100, false, 60);
for(int i = 0; i < 50; i++) {
bang.update();
cout << bang.getTemp() << " ";
if(i % 10 == 9) cout << endl;
}
}
最后,Makefile_Executable:
all: TempControlTest
TempControlTest: TempControlTest.cpp BangBangControl.o
g++ -o TempControlTest TempControlTest.cpp
BangBangControl.o: BangBangControl.cpp HeatingUnit.o
g++ -c BangBangControl.cpp
HeatingUnit.o: HeatingUnit.cpp
g++ -c HeatingUnit.cpp
clean:
rm -rf *.o TempControlTest
再次,非常感谢你!
答案 0 :(得分:1)
如果您的可执行文件依赖于其源代码和另一个对象,则还需要链接该对象。您可以将第一个(实际)规则更改为(依赖项列表和HeatingUnit
命令中可能还需要g++
个内容):
TempControlTest: TempControlTest.cpp BangBangControl.o
g++ -o TempControlTest TempControlTest.cpp BangBangControl.o
您还应该记住,您可能还需要依赖标题文件。如果不这样做,对BangBangControl.h
的更改将不会重建BangBangControl.o
或TempControlTest
。
而且,这是个人偏好,我总是使每个rul依赖于makefile
文件,这样,如果我更改了makefile,一切都会自动重建。
根据您的所有文件内容,我会有类似的内容:
# Non-file rules (all is default).
all: TempControlTest
clean:
rm -rf *.o TempControlTest
# Build executable from all objects.
TempControlTest: makefile TempControlTest.o BangBangControl.o HeatingControl.o
g++ -o TempControlTest TempControlTest.o BangBangControl.o HeatingControl.o
# Build objects from source (C and headers).
TempControlTest.o: makefile TempControlTest.cpp BangBangControl.h
g++ -c TempControlTest.cpp
BangBangControl.o: makefile BangBangControl.cpp BangBangControl.h HeatingUnit.h
g++ -c BangBangControl.cpp
HeatingUnit.o: makefile HeatingUnit.cpp HeatingUnit.h
g++ -c HeatingUnit.cpp
答案 1 :(得分:1)
您并非将对象链接在一起。
你有两行正在编译 BangBangControl.cpp
和HeatingUnit.cpp
到两个.o
文件(虽然我怀疑你需要BangBangControl.o
依赖在HeatingUnit.o
)。但是你需要将它们放在一起到最终的可执行文件中(这称为“链接”)。
TempControlTest: TempControlTest.cpp BangBangControl.o HeatingUnit.o
g++ -o TempControlTest TempControlTest.cpp HeatingUnit.o BangBangControl.o
在上面的行中,TempControlTest.cpp
本身将被编译,然后与两个已经编译好的对象链接在一起,它们似乎依赖于一个可执行文件。
注意:当您收到“未定义的引用”错误时,通常意味着您的代码编译正常,但缺少需要链接的符号。
NB2:您的makefile规则不会导致cpp文件依赖于它们使用的标头。这意味着当您更改标题并运行“make”时,make会告诉您已经构建的所有内容。那很糟糕。
答案 2 :(得分:0)
尝试这样的事情:
all: TempControlTest
TempControlTest: TempControlTest.cpp BangBangControl.o HeatingUnit.o
g++ -o TempControlTest BangBangControl.o HeatingUnit.o TempControlTest.cpp
BangBangControl.o: BangBangControl.cpp BangBangControl.h
g++ -c BangBangControl.cpp
HeatingUnit.o: HeatingUnit.cpp HeatingUnit.h
g++ -c HeatingUnit.cpp
clean:
rm -rf *.o TempControlTest
如果页面上的格式丢失,请务必制作缩进标签
答案 3 :(得分:-1)
你可以替换这一行
BangBangControl.o: BangBangControl.cpp HeatingUnit.o
带
BangBangControl.o: BangBangControl.h BangBangControl.cpp HeatingUnit.o