从变量单独生成对象
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)
这就是你所需要的。
我正在执行 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)
这就是你所需要的。