我有这个Makefile似乎正在工作,但我不确定如何:
EXECUTABLE=hello
CC=gcc
OBJS = a.o
all: $(EXECUTABLE)
%.o : %.c
$(CC) -o $@ -c $<
$(EXECUTABLE): $(OBJS)
$(CC) -o $@ $<
我知道前3行是本地定义,当我输入“Make”时,它将构建all
目标。现在从这里我有点失落......我猜:
$(EXECUTABLE)
标签并跳转该构建命令$(OBJS)
标签,并且由于本地目录中不存在a.o
,它会跳转到模式匹配规则a.c
并运行规则以生成a.o
$(EXECUTABLE)
命令并运行.o文件的组合以制作“hello”程序问题:
答案 0 :(得分:1)
你的流程基本上是正确的。如果您没有在命令行上显式传递一个目标,Make将构建文件中列出的第一个目标。在大多数makefile中,人们将all
作为第一个目标,因此在您的示例中,您只需键入make
,它就会自动构建all
目标。内部的作用是构建您在Makefile中定义的依赖项列表。 all
取决于$(EXECUTABLE)
,这取决于$(OBJS)
。为了满足all
目标的创建,它必须从该依赖列表的底部开始并逐步完成。制作手册实际上非常好,如果你想看看这里:http://www.gnu.org/software/make/manual/,特别是你的具体问题:http://www.gnu.org/software/make/manual/make.html#How-Make-Works
答案 1 :(得分:1)
我找到了一个工具来帮助至少回答我问题的一部分,所以我会发布它以供我自己和其他人参考:
可以通过$(warning <some string>)
调用“调试”Makefile。
所以在我的例子中我使用它:
all: $(warning All before exe call) $(EXECUTABLE)
$(warning All warning after call)
%.o : %.c
$(warning before pattern)
$(CC) -o $@ -c $<
$(warning after pattern)
$(EXECUTABLE): $(warning before obj) $(OBJS)
$(warning after obj)
$(CC) -o $@ $<
输出结果显示了流程:
mike@mike-VirtualBox:~/C$ make
Makefile:6: All before exe call // started at all
Makefile:14: before obj // Jumped to EXECUTABLE label
Makefile:10: before pattern // Jumped to pattern matching
Makefile:10: after pattern
gcc -o a.o -c a.c
Makefile:15: after obj // back to EXECUTABLE label
Makefile:15: after build // back to build command
gcc -o hello a.o
Makefile:7: All warning after call
使用这个我发现我可以这样做:
$(EXECUTABLE): $(warning before obj) $(OBJS)
但不是:
$(EXECUTABLE):
$(warning before obj)
$(OBJS)
这是有道理的,因为空格在Makefile中很重要