不执行正确的Makefile

时间:2014-11-06 03:59:40

标签: c++ makefile igraph

我应该这样说,我对Makefiles很新。

我创建了以下Makefile:

all: tiling_graph.o
        g++ -o tiling_graph tiling_graph.o -L/usr/local/lib -ligraph

我正在努力确保包含-ligraph。但是,当我输入“make”时,我得到以下输出:“c ++ -c -o tiling_graph.o tiling_graph.cpp”

为什么不使用我在当前目录中创建的Makefile?我尝试过使用“make -f Makefile”和“make --file = Makefile”,但这些都不起作用。

此外,在我第一次制作Makefile之后,它正常工作。输入make后的输出是 “g ++ -o tiling_graph tiling_graph.o -L / usr / local / lib -ligraph”

我执行了./tiling_graph并且它成功了。

然后我编辑了tiling_graph.cpp,再次运行make,输出结果是“c ++ -c -o tiling_graph.o tiling_graph.cpp”并且从那时起就一直存在。

我真的很感激任何帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

考虑制作规则的简单方法:

target: dependency list
        commands to make the target

是从依赖列表中的文件列表中创建名为target的文件的配方。由于make可以看到文件系统,因此它可以判断依赖项列表中的任何文件是否比名为target的文件更新,这是重新创建target的信号。毕竟,如果没有任何依赖项发生更改,则目标必须是最新的。

请注意make对如何构建文件有很多了解。特别是,它有很多内置的“模式”规则,因此它知道,例如,如何从C ++源文件(prog.o)或从中生成目标文件(prog.cpp) C源文件(prog.c)或许多其他内容。因此,当你有其他需求时,你只需要实际编写一个makefile,比如一个库(甚至那时你可以将它添加到环境变量中,但makefile更好)。

现在,您实际上并不想构建名为all的文件。您想构建一个名为tiling_graph的文件。所以正确的制定规则是:

tiling_graph: tiling_graph.o
        g++ -o tiling_graph tiling_graph.o -L/usr/local/lib -ligraph

由于make已经知道如何创建tiling_graph.o,因此它实际上可以确定如何从tiling_graph制作tiling_graph.cpp

那么这个all来自哪里?使用all的常用方法是:

all: program1 program2 program3

告诉make all目标需要program1program2program3。因此,如果您需要构建所有这三个程序,all规则将允许您只执行一个make命令。由于没有名为all的文件,这是一个“假的”目标,并且(至少使用gnu make)它应该被声明为虚假的目标:

all: tiling_graph
.PHONY: all

但如果您只是想构建一个程序,那么您真的不需要它。

当您只键入make(而不是make target)时,make会选择makefile中的第一个目标。因此,如果你把你通常想要建立的东西放在第一位,你就可以节省一些打字。