2017-04-03 108 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