所以我有一个直截了当的问题。
我有文件List.hpp
,List.h
和test_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?
答案 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中使用它的更多信息: