GNU Make Включая исходные файлы из целевых переменных - PullRequest
0 голосов
/ 29 февраля 2012

Я пытался собрать две программы с помощью одного Makefile GNU с помощью make prog1 или make prog2. Я попытался использовать переменные, специфичные для цели, чтобы указать исходные файлы, которые являются исключительными для цели, но ни test1.c, ни test2.c не были собраны На них ссылаются только при связывании исполняемого файла. Как получить Makefile для компиляции test1.c или test2.c?

Вот выдержки из моего Makefile:

...
prog1: PASRC = test1.c
prog2: PASRC = test2.c
...
ASRC = $(PASRC) common.c
...
OBJS = $(ASRC:.c=.o)
...
prog1: $(OBJS) prog1.elf
prog2: $(OBJS) prog2.elf
...
%elf: $(OBJS)
    $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $@

Заранее спасибо за помощь

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

Нет необходимости использовать целевые переменные.Обычных зависимостей должно быть достаточно:

all : prog1 prog2 # default target

prog1 : test1.o 
prog2 : test2.o 
prog1 prog2 : common.o

%.o : %.c # how to build any .o from a corresponding .c
    $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $< 

prog1 prog2 : % : 
    $(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@
0 голосов
/ 01 марта 2012

Если у вас нет каких-то особых требований, которые вы не заявили, я предлагаю позволить make сделать работу за вас (правила и флаги по умолчанию).

PROGS = prog1 prog2
COMMON_OBJS = common.o

all: $(PROGS)
prog1 prog2: % : %.o $(COMMON_OBJS)

clean:
        rm -f $(PROGS) $(PROGS:%=%.o) $(COMMON_OBJS)

Вы по-прежнему можете устанавливать CLFAGS, LDFLAGS и т. Д. (В командной строке или в файле makefile), и правила по умолчанию будут выбирать их.

Если вы используете GNU make, вы можете увидеть все сгенерированные и автоматические правила, запустив:

make -n -p

Это большой вывод, поэтому я советую отправить его на ваш пейджер.

...