首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使不能正确执行Makefile

使不能正确执行Makefile
EN

Stack Overflow用户
提问于 2014-11-06 11:59:40
回答 1查看 704关注 0票数 1

我应该在开始之前说一句,我对Makefiles非常陌生。

我创建了以下Makefile:

代码语言:javascript
复制
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“,从那以后一直如此。

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

EN

回答 1

Stack Overflow用户

发布于 2014-11-06 12:29:29

思考make规则的一个简单方法:

代码语言:javascript
复制
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规则应该是:

代码语言:javascript
复制
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的方法是:

代码语言:javascript
复制
all: program1 program2 program3

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

代码语言:javascript
复制
all: tiling_graph
.PHONY: all

但是如果你只想构建一个程序,你真的不需要这样做。

当您只需输入make (而不是make target)时,make将选择makefile中的第一个目标。因此,如果您将通常想要构建的东西放在第一位,您将省去一些输入。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26771474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档