2014-10-16 9 views
0

У меня есть большое количество небольших программ на C (все одиночные файлы .c), и я хотел бы создать их все в отдельные исполняемые файлы. То есть prog-01.c, prog-02.c и т. Д. Должны быть построены отдельно, и результат должен быть индивидуальным исполняемым для этой программы.исходный код исходного кода в make-файле

Я относительно новичок в использовании подстановочных знаков в make-файлах, и я был бы признателен за помощь. Вот что я сделал до сих пор:

CC = gcc 
CFLAGS = -g -Wall -Werror 

SRCS:=$(wildcard *.c) 
OBJS:=$(SRC:.c=.bin) 

all-gcc: $(SRCS) 
    $(CC) $(CFLAGS) $(SRCS) -o $(OBJS) 

run-%-gcc: prog-%-gcc 
     @./$(<) 

prog-%-gcc: prog-%.c 
     $(CC) $(CFLAGS) $< -o [email protected] 

clean: 
    @rm *.o 

ответ

1

Если бы я шел по этому пути, я бы, вероятно, использовать:

CC  = gcc 
CFLAGS = -g -Wall -Werror 

SRCS := $(wildcard *.c) 
PROGS := $(SRCS:.c=) 
OBJS := $(SRCS:.c=.o) 

all: $(PROGS) 

clean: 
    rm -f $(OBJS) $(PROGS) 

Это преобразует каждый файл program.c в исполняемый program, используя по умолчанию правило для создания программы из исходного файла C.

+0

Ничего себе, это сработало отлично! не могли бы вы подробнее рассказать о том, что здесь происходит? – audiFanatic

+0

Вы знаете, как работает шаблон, создавая список имен файлов, заканчивающихся '.c'. Следующее присваивание создает список имен с суффиксом '.c', замененным пустой строкой, эффективно удаляя' .c'. Они считаются программами. Конечно, 'make' знает, как создать программу из одного исходного файла C. Цель «все» будет обновлена, когда все программы будут обновлены. Таким образом, стандартные встроенные правила заботятся обо всей тяжелой работе. Макрос OBJS содержит имена объектных файлов, если вы используете Unix. «Чистая» цель удаляет программы и объектные файлы. –

+0

А, это то, чего я не получал; Я не понимал, что make может автоматически создавать вещи без явного правила. В этом случае, как мне изменить это, чтобы использовать явное правило? Мне нужно сделать еще одно правило, которое будет запускать все из них одновременно? использование './$ (PROGS)' запускает только первую программу, а затем рассматривает остальные как аргументы. – audiFanatic

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