我应该在开始之前说一句,我对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“,从那以后一直如此。
我真的很感谢任何人的帮助。谢谢!
发布于 2014-11-06 12:29:29
思考make规则的一个简单方法:
target: dependency list
commands to make the target它是从依赖项列表中的文件列表制作名为target的文件的方法。因为make可以看到文件系统,所以它可以判断依赖项列表中是否有任何文件比名为target的文件新,这是它重新创建target的信号。毕竟,如果所有依赖项都没有更改,则目标必须是最新的。
请注意,make非常了解如何构建文件。特别是,它有许多内置的“模式”规则,因此它知道,例如,如何从C++源文件(prog.cpp)或从C源文件(prog.c)或许多其他内容生成目标文件(prog.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.cpp创建tiling_graph。
那么这个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中的第一个目标。因此,如果您将通常想要构建的东西放在第一位,您将省去一些输入。
https://stackoverflow.com/questions/26771474
复制相似问题