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

Write a makefile to compile a .h .hpp and .cpp together into an executable

本文关键字:hpp cpp 一起 可执行文件 编译 makefile 一个      更新时间:2023-10-16

所以我有一个简单的问题。

我有List.hpp, List.htest_list.cpp文件

List.hpp包含List.h文件的函数定义。List.h文件在倒数第三行包含"List.hpp"。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?

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

因此,您应该使用c++编译器:g++gcc是一个C编译器,不懂c++。

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

proj2: test_list.o
        $(CXX) $(LDFLAGS) $(LDLIBS) -o $@
clean:
        rm *.o proj2

通常不希望单独编译头文件。它旨在包含在源文件中,源文件就是您编译的内容。

考虑到典型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,可能不值得去自动生成依赖,但是对于一个大的Makefile来说,这样做是值得的。您甚至可以将此作为Makefile本身的一个步骤,通过使用-MM运行gcc来生成依赖项(将输出定向到一个文件),并将该文件包含到执行实际工作的Makefile中。

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

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

不编译。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"