2017-04-03 67 views
1

我在做一个Makefile以使用相同的gcc命令创建对象。这个文件看起来是这样的:通过变量分别生成对象

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

$(OBJLIB) : $(SRCLIB) 
    $(CC) $(CCFLAGS) -c $^ -o [email protected] 

的objetive是执行此类似:

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

但我不知道该怎么做,我测试一切都没有工作。是否有可能在Makefile中做到这一点?

回答

1

你的Makefile扩展到这一点,变量展开后:

main.o srv.o : main.c srv.c 
     $(CC) $(CCFLAGS) -c $^ -o [email protected] 

在时许,在明确的规则使用多目标像这一样多次编写规则,一次为每个目标。所以,这是一样的:

main.o : main.c srv.c 
     $(CC) $(CCFLAGS) -c $^ -o [email protected] 
srv.o : main.c srv.c 
     $(CC) $(CCFLAGS) -c $^ -o [email protected] 

这意味着,如果任何的源文件的变化,无论是目标文件将被重新创建(因为每一个对象依赖于两个来源,而不仅仅是他们自己的源文件)。

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

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) 

这就是你所需要的。

+0

你是对的,那是我的问题。我做了你所说的话,它像魅力一样工作,谢谢你! – captainepoch