我正在使用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
?
答案 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)
这就是你所需要的一切。