深入理解使用特定案例如何解释makefiles

深入理解使用特定案例如何解释makefiles,makefile,Makefile,我试图深入理解makefile是如何工作的 例如,我有以下一个: CC = gcc CFLAGS = -I. DEPS = int_array.h OBJS = int_array.o test_int_array.o %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) test_int_array: $(OBJS) $(CC) -o $@ $^ $(CFLAGS) clean: rm -rf *.o test_int

我试图深入理解makefile是如何工作的

例如,我有以下一个:

CC = gcc
CFLAGS = -I.
DEPS = int_array.h
OBJS = int_array.o test_int_array.o

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)


test_int_array: $(OBJS)
    $(CC) -o $@ $^ $(CFLAGS)


clean:
    rm -rf *.o test_int_array *.dSYM
这意味着生成一个名为“test_int_array”的可执行文件(基本上由右侧的
$(OBJS)
文件中的这些选项
-o$@
表示)(使用选项
$^

这两种情况都需要
$(CFLAGS)
吗?顺序重要吗?

在示例中:

test_int_array: $(OBJS)
    $(CC) -o $@ $^ $(CFLAGS)
%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)
$@
是此规则的目标文件名:
test\u int\u array

$^
是所有先决条件的名称。
这将是包含在
OBJS
中的任何内容,因此:
int\u array.o test\u int\u array.o


在示例中:

test_int_array: $(OBJS)
    $(CC) -o $@ $^ $(CFLAGS)
%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)
%.o:%.c$(DEPS)
$(CC)-c-o$@$<$(CFLAGS)

$在Makefile中,每个规则都遵循以下格式:

resulting_file : source_files
  steps to get resulting_file from source_files
在规则中分别称为lefthand和righthand的是生成的_文件和源_文件


%.ext:%.ext2

是一种模式规则。如果Makefile可以在与
.ext2
相同的路径上找到文件,则它允许您的Makefile自动创建所需的任何
.ext
文件

%.c:%.o

是一种模式规则,用于从其等效的
.c
文件(int\u array.o test\u int\u array.c)中获取
.o
文件(int\u array.c test\u int\u array.o)

当您指定需要
$(OBJS)
来构建
test\u int\u数组
文件时,将调用此函数

模式规则会自动使用某些变量,例如
$(CFLAGS)
,因此您无需手动将其添加到该规则中。您可以在模式规则中找到隐式使用的变量的完整列表:



你可以找到关于
$@
$的先决条件你指的是
右侧指定的内容:
?是的-
make
(以及
makefiles
)是
makefile
的一个syn。无需在这里为标签争吵:)@JonClements编辑顺序实际上是因为标签
c
。标签
c
是否适用于这个问题?@2501好的-在这里我觉得没什么用。。。所以,我不知道该怎么做……就像每个Unix命令一样,
make
带有一个,你可以在那里找到你问题的答案。@sokkyoku我不能接受两个答案,两个都给了我很好的信息,这就是我为什么不接受的原因。如果我接受其中一个,而不是另一个,这对你们中的一个来说是不公平的……但事实上,我会接受你们的,因为你们有很高的声誉;)