我应该先说我对 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”并且一直如此。
如果有任何帮助,我将不胜感激。谢谢!
最佳答案
考虑 make 规则的简单方法:
target: dependency list
commands to make the target
是它是从依赖项列表中的文件列表中创建名为 target
的文件的方法。由于 make
可以看到文件系统,它可以判断依赖列表中的任何文件是否比名为 target
的文件新,这是它重新创建 target 的信号
。毕竟,如果所有依赖项都没有更改,则目标必须是最新的。
请注意,make
非常了解如何构建文件。特别是,它有很多内置的“模式”规则,所以它知道,例如,如何从 C++ 源文件 () 生成目标文件 (
) 或来自 C 源文件 (prog.o
) prog.cppprog.c
) 或许多其他东西。因此,您只需要在有其他需求(例如库)时实际编写一个 makefile(即使这样您也可以将其添加到环境变量中,但 makefile 更好)。
现在,您实际上并不想构建一个名为all
的文件。您想要构建一个名为 tiling_graph
的文件。所以正确的 make 规则是:
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 中的第一个目标。因此,如果您将通常要构建的内容放在首位,则可以节省一些输入时间。
关于c++ - make 没有执行正确的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26771474/