我的makefile不起作用

时间:2012-02-03 03:24:19

标签: c++ makefile

我是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

再次,非常感谢你!

4 个答案:

答案 0 :(得分:1)

如果您的可执行文件依赖于其源代码另一个对象,则还需要链接该对象。您可以将第一个(实际)规则更改为(依赖项列表和HeatingUnit命令中可能还需要g++个内容):

TempControlTest: TempControlTest.cpp BangBangControl.o
    g++ -o TempControlTest TempControlTest.cpp BangBangControl.o

您还应该记住,您可能还需要依赖标题文件。如果不这样做,对BangBangControl.h的更改将不会重建BangBangControl.oTempControlTest

而且,这是个人偏好,我总是使每个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.cppHeatingUnit.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