从变量单独生成对象

Generate objects individually from variables

我正在执行 Makefile 以使用相同的 gcc 命令制作对象。该文件如下所示:

SRCLIB = main.c srv.c
OBJLIB = main.o srv.o
CC = gcc
CCFLAGS = -Wall -Werror

$(OBJLIB) : $(SRCLIB)
    $(CC) $(CCFLAGS) -c $^ -o $@

目标是像这样执行:

gcc -Wall -c read_line.c -o read_line.o
gcc -Wall -c client.c -o client.o

但我不知道该怎么做,而且我测试的所有内容都不工作。甚至可以在 Makefile 中做到这一点吗?

你的 makefile 扩展成这样,变量扩展后:

main.o srv.o : main.c srv.c
        $(CC) $(CCFLAGS) -c $^ -o $@

在 make 中,像这样在显式规则中使用多个目标与多次编写规则相同,每个目标一次。因此,这与此相同:

main.o : main.c srv.c
        $(CC) $(CCFLAGS) -c $^ -o $@
srv.o : main.c srv.c
        $(CC) $(CCFLAGS) -c $^ -o $@

这意味着如果其中一个源文件发生更改,将重新创建两个目标文件(因为每个对象都依赖于两个源,而不仅仅是它们自己的源文件)。

此外,在您的编译行中,您使用变量 $^ 扩展到所有先决条件。所以你的编译行将扩展为:

gcc -Wall -Werror -c main.c srv.c -o main.o
gcc -Wall -Werror -c main.c srv.c -o srv.o

这是非法的:如果将 -c-o 选项一起使用,则只能编译一个源文件。

Make 内置规则,已经知道如何编译文件,因此无需自己编写。你可以这样写:

SRCLIB = main.c srv.c
OBJLIB = main.o srv.o
CC = gcc
CCFLAGS = -Wall -Werror

.PHONY: all
all: $(OBJLIB)

这就是你所需要的。