我正在尝试编辑一个makefile,我之前已经构建了自己的文件,但是我很难理解这个非常简单的例子,它明确地使用了我不知道的约定。我已经检查了GNU文档,但我不太确定要搜索什么。
makefile定义SRCS
OBJS
LIBS
CC
CFLAGS
makefile然后编译库而不用具体说明。例如文件中的行是:
mgrid.o: array_alloc.h timer.h
但makefile实际执行:
gcc -std=c89 -Wall -Wextra -pedantic -c -o mgrid.o mgrid.c
有人可以帮忙解释一下这里发生了什么吗?在哪里可以找到有关如何定义这些标准的信息?
答案 0 :(得分:2)
make
有一定的默认规则
$(CC) $(CFLAGS) -o $@ $^
是一般默认规则。
mgrid.o: array_alloc.h timer.h
仅表示mgrid.o
也依赖于array_alloc.h timer.h
答案 1 :(得分:1)
mgrid.o:array_alloc.h timer.h
表示“只有在更改了array_alloc.h timer.h时才编译mgrid.o”。 你没有说明必须应用哪个规则,所以make将把他的dafault规则用于.o文件,这是Sergey L.给出的行:
$(CC)$(CFLAGS)-o $ @ $ ^
当make看到.o文件时,它会查找同名的.c文件。
答案 2 :(得分:0)
在您的makefile中,您将mgrid.o
的依赖关系设置为array_alloc.h
和timer.h
。
makefile检查是否存在以下文件:
array_alloc.h timer.h
既然如此,它就会继续将mgrid.c
编译为mgrid.o
。
答案 3 :(得分:0)
正如Sergey L.所说,它告诉mgrid依赖于这两个文件, 这意味着: 检查文件是否存在, 检查编译mgrid.o后是否修改了它们:如果是,请重新编译。