编写一个makefile,将.h .hpp和.cpp一起编译成可执行文件

时间:2016-10-11 20:51:53

标签: c++ makefile g++

所以我有一个直截了当的问题。

我有文件List.hppList.htest_list.cpp

List.hpp包含List.h文件的函数定义。 List.h文件包含" List.hpp"在第3到最后一行。 test_list.cpp运行程序并包含" List.h"在顶部。

我需要一个makefile,将它们编译成可执行文件" project.x"。

到目前为止:

    proj2: List.o test_list.o
        gcc -o proj2.x List.o test_list.o

    List.o:
        gcc -c List.hpp


    test_list.o:
        gcc -c test_list.cpp

    clean:
        rm *.o proj2.x

然而,它会导致各种错误,所有错误都处理其中包含List <T>的行,并指出List没有命名类型。我认为这是因为我没有正确地包含头文件。

我如何制作这个makefile?

3 个答案:

答案 0 :(得分:1)

您不能编译.h或.hpp文件。您只编译.c或.cpp文件。你可能想要一些东西(缩进标签,不是空格,空格是SO和python的东西,标签是makefile的东西):

proj2: list.cpp list.hpp list.h
    g++ -o proj2.x list.cpp
clean:
    rm proj2.x

此外,在您的C文件中,您将需要:

#include "List.h" /* Note the quotes: *
#include <list.h>  * won't work       */

同样适合你的#include "List.hpp"

答案 1 :(得分:1)

根据文件扩展名和描述判断,您正在编译C ++代码。

因此,您应该使用C ++编译器:=OR(A1="yes",OR(B1="yes",C1="yes")) g++是一个C编译器,不了解C ++。

你应该让make为你编译你的代码,它知道该怎么做:

gcc

答案 2 :(得分:1)

您通常不希望孤立地编译标头。它旨在包含在源文件中,源文件是您编译的内容。

鉴于典型make实用程序中的隐式依赖项,您可以稍微减少Makefile:

proj2.x: test_list.o
    g++ -o proj2.x test_list.o

test_list.o: test_list.cpp List.hpp

clean:
    -rm *.o proj2.x

至少假设Make的合理最新版本,它已经知道如何编译.cpp文件以获取.o文件。

如果您遇到编译器错误,那么它们至少可能是源于代码中的问题,而不是Makefile中的问题。显而易见的例外情况是您的C ++代码无法正确链接,因为您使用gcc代替g++来链接它。

顺便说一下,标题依赖项如下所示:

test_list.o: test_list.cpp List.hpp

...是gcc可以使用-MM标志自动生成的内容。对于像这样的小型Makefile,它可能不值得自动生成依赖项,但对于大型的,它可能是值得的。您甚至可以通过运行带有-MM的gcc来将此作为Makefile本身中的一步来生成依赖项(将输出定向到文件)并将该文件包含到执行实际工作的Makefile中。

有关依赖关系生成以及如何在Makefile中使用它的更多信息:

http://scottmcpeak.com/autodepend/autodepend.html