从变量单独生成对象

时间:2017-04-03 18:16:01

标签: makefile target

我正在使用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

中执行此操作

1 个答案:

答案 0 :(得分:1)

扩展变量后,你的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)

这就是你所需要的一切。