2013-04-06 3 views
4

Я узнал из руководства GNU, чтобы знак $^ был автоматической переменной, которая представляет имена всех предварительных условий. Однако я упал на Makefile, как это:

SVR_OBJECT_FILES =  server.o\ 
         server_func.o 

CLT_OBJECT_FILES =  client.o 

CFLAGS =    -Wall -Werror -W 


CC =     gcc 

all:     client/client server/serveur 

client/client:   $(CLT_OBJECT_FILES) 

server/serveur:  $(SVR_OBJECT_FILES) 

client/client server/serveur: 
    @mkdir -p $(dir [email protected]) 
    $(CC) $(CFLAGS) $^ -o [email protected] 

%.o: %.c 
    $(CC) -c $< 

clean: 
    rm -f client/client server/serveur *.o 

Который работает нормально, так что мой вопрос: Как можно ниже команда может связать правильные объектные файлы, а^переменная $ не имеет в виду не preprerequisites вообще. (Правило не имеет предпосылок)

$(CC) $(CFLAGS) $^ -o [email protected] 

ответ

5

$^ содержит все предпосылки цели, а не только те, которые указаны с самим правилом. Тот же файл может отображаться в качестве мишени несколько раз в правилах без команд:

sometarget: dependency1 
… 
sometarget: dependency2 
     assemble -o [email protected] $^ 
… 
sometarget: dependency3 

Зависимости sometarget являются dependency1, dependency2 и dependency3, и когда команда assemble вызывается make sometarget, он будет получать все три, как аргументы.

Здесь $^ будет содержать все $(CLT_OBJECT_FILES) или $(SRV_OBJECT_FILES) в зависимости от того, для какой цели предназначена эта команда.

+0

Спасибо, merci! – Jpaille

Смежные вопросы