我应该这样说,我对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”并且从那时起就一直存在。
我真的很感激任何帮助。谢谢!
答案 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
目标需要program1
,program2
和program3
。因此,如果您需要构建所有这三个程序,all
规则将允许您只执行一个make
命令。由于没有名为all
的文件,这是一个“假的”目标,并且(至少使用gnu make)它应该被声明为虚假的目标:
all: tiling_graph
.PHONY: all
但如果您只是想构建一个程序,那么您真的不需要它。
当您只键入make
(而不是make target
)时,make
会选择makefile中的第一个目标。因此,如果你把你通常想要建立的东西放在第一位,你就可以节省一些打字。