2014-01-08 5 views
0

Я написал простой make для проверки с помощью правила шаблона. Вот оно:Простой шаблон в make

default: 
    echo This is default target 
%.o:%.c 
    gcc -c $< -o [email protected] 
clean: 
    rm -f *.o 

У меня есть три * .c файлы в pwd. После make команды у меня есть:

echo This is default target 
This is default target 

, но я ожидал, что любой *.c файл в pwd будет составлен.

+0

вы имеете в виду вам исходные файлы не компилируется? –

+0

Ожидаете ли вы, что дефолт прошел все цели? Как бы то ни было, если вы хотите скомпилировать foo.c, вы должны ввести 'make foo.o'. – tabstop

ответ

1

Первая цель в makefile - это та, которая построена, когда вы не укажете конкретное имя цели.

В вашем makefile, default во-первых, поэтому он создан.

Часто вы создадите цель all в качестве первой цели и перечислите программы, которые должны быть построены более или менее хитрыми средствами.

.PHONY: default all clean 

default: 
    @echo "You must specify which program you want built (or specify all)" 

SRCS = $(wildcard *.c) 
PROGS = ${SRCS:.c=} 

all: ${PROGS} 

%.o:%.c 
    gcc -c $< -o [email protected] 

clean: 
    rm -f *.o 

.PHONY цель определяет, что default, all и clean не настоящие файлы, но phony targets.

У меня есть каталог со многими исходными файлами в нем, и у меня есть правило по умолчанию, аналогичное приведенному выше, как первая цель, но у меня также есть цель all, так что make all работает разумно.

Я предпочитаю использовать ${...} нотации около make переменных, которые make всегда принимал; многие люди используют $(...) обозначение все время.

+0

Я также думаю, что make-файл OP даже НЕ может создать целевой 'default'? Я НЕ уверен, что он хочет создать цель или НЕ, в моем ответе он будет генерировать 'default' в качестве целевой программы, верно? –

+0

Это фальшивая цель, вроде 'все' и' clean' тоже. –

+0

ОК, может быть, я понял, OP не хочет создавать настоящую цель? –

0

Я думаю, что default - ваша целевая программа, но она не связывала никаких объектов? увидеть мой Makefile:

SRCS = $(wildcard *.c) 
OBJS = $(patsubst %.c, %.o, $(SRCS)) 

default: 
    @echo This is default target 
Program: $(OBJS) 
    gcc $^ -o [email protected] 
$(OBJS): $(SRCS) 
    gcc -c $^ 
clean: 
    rm -f $(OBJS) $(Program) 

если вы наберете make, это просто echoThis is default target, если вы хотите сделать реальную цель, вы можете ввести make Program

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