Makefile 我无法从GNU手册中找出GNU生成模式规则示例

Makefile 我无法从GNU手册中找出GNU生成模式规则示例,makefile,Makefile,以下是一个例子: %.o : %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ %.o:%.c $(CC)-c$(CFLAGS)$(CPPFLAGS)$

以下是一个例子:

     %.o : %.c
         $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
%.o:%.c
$(CC)-c$(CFLAGS)$(CPPFLAGS)$<-o$@
据我所知,这条规则会查找所有c源文件*.c并将它们编译成目标文件*.o。当我只想将文件编译成目标文件时,如何定义“全部”规则

另外,如果我想构建一个可执行文件,我如何破坏链接规则?比如:

    TARGET = bsort
    CPPFLAGS = -g -Wall
    LFLAGS = 
    all: $(TARGET)

    $(TARGET): ???
    $(CC) $(LFLAGS) %.o -o $(TARGET)

     %.o : %.c
         $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
TARGET=b排序
CPPFLAGS=-g-Wall
LFLAGS=
全部:$(目标)
美元(目标):???
$(CC)$(LFLAGS)%.o-o$(目标)
%.o:%.c
$(CC)-c$(CFLAGS)$(CPPFLAGS)$<-o$@

所以,我尝试使用模式规则创建两个makefile,一个makefile编译成对象文件,另一个makefile编译成可执行文件。我的项目通常有多个源文件和头文件

那条规则什么也找不到。它只是告诉make,“如果您想要构建一个.o文件,并且有一个.c文件可用,那么下面是您可以使用的方法”

如果您在一个目录中运行
make
,该目录中的makefile只包含该规则,您将收到一条消息
nothing to do
,因为您实际上没有告诉make构建任何特定的内容,您只是告诉它如何构建某些内容

如果希望有一个只生成对象文件的
all
规则,则可以编写:

.PHONY: all
all: foo.o bar.o baz.o
现在make有了一个具有真正依赖关系的真正目标,它可以使用您定义的模式规则来构建那些.o文件

不能在配方中使用
%.o
。配方是用shell脚本语法编写的,
%.o
不是shell脚本语法。您可以编写
*.o
,这是shell脚本,但这不是一个好的解决方案。相反,您应该将目标的先决条件定义为要链接的.o文件,然后使用
$^
自动变量在配方中引用它们(请参阅GNU make manual中有关自动变量的部分):


为什么要有两个不同的makefile?您可以将所有规则放在同一个生成文件中。

该规则找不到任何内容。它只是告诉make,“如果您想要构建一个.o文件,并且有一个.c文件可用,那么下面是您可以使用的方法”

如果您在一个目录中运行
make
,该目录中的makefile只包含该规则,您将收到一条消息
nothing to do
,因为您实际上没有告诉make构建任何特定的内容,您只是告诉它如何构建某些内容

如果希望有一个只生成对象文件的
all
规则,则可以编写:

.PHONY: all
all: foo.o bar.o baz.o
现在make有了一个具有真正依赖关系的真正目标,它可以使用您定义的模式规则来构建那些.o文件

不能在配方中使用
%.o
。配方是用shell脚本语法编写的,
%.o
不是shell脚本语法。您可以编写
*.o
,这是shell脚本,但这不是一个好的解决方案。相反,您应该将目标的先决条件定义为要链接的.o文件,然后使用
$^
自动变量在配方中引用它们(请参阅GNU make manual中有关自动变量的部分):

为什么要有两个不同的makefile?您可以将所有规则放在同一个makefile中