2013-10-07 2 views
0

У меня есть старый проект, для которого я пытаюсь создать несколько двоичных файлов, по одному для каждого объекта в каталоге. Я не могу за всю жизнь понять, как бороться с несколькими целями таким образом. Следующие работы, но мне кажется, я должен быть в состоянии иметь одно правило, чтобы связать их все, так сказать,gnu сделать несколько целей один объект каждый

# compile objects, no problem 
%.o: %.c 
    $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

bin: bin.o 
    $(CC) -o [email protected] $< ../lib/libfoo.a -lm $(ARCH) 

bar: bar.o 
    $(CC) -o [email protected] $< ../lib/libfoo.a -lm $(ARCH) 

Один подход, который я приступить к работе, чтобы сдирать суффикс от цели имя, как это и скомпилировать и скомпоновать в один шаг, но он чувствует себя немного хаком,

%.o: %.c 
    $(CC) $(CFLAGS) $(CPPFLAGS) $< ../lib/libfoo.a -lm -o $(*F) 

Отказ от ответственности: я презираю сделать

UPDATE 1: это то, что я закончил с

EXECS = bin bar ... 

all: $(EXECS) 

%: %.c 
     @echo "Building [email protected] from $<" 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 
     $(CC) $(CFLAGS) $(CPPFLAGS) [email protected] ../lib/libfoo.a -lm -o [email protected] 

ответ

1

Соглашение состоит в том, чтобы иметь что-то вроде этого в верхней части Makefile:

.PHONY: all 
all: bin bar 

Таким образом make all сделает bin и bar, и поместив его в верхней его цели по умолчанию для make без аргументов. .PHONY: документирует это как «metatarget», но также инструктирует Make выполнить его, даже если есть файл с именем all со свежей датой.

%: %.o 
    $(CC) -o [email protected] $< ../lib/libfoo.a -lm $(ARCH) 

Это говорит о том, как сделать их обоих.

+0

Второе правило помогло мне приблизиться к тому, что я хотел, не знаю, почему, но когда я использовал ваш пример, «сделать все» не выполнял какое-то неявное правило для каждого из двоичных файлов в списке (строка бинов ...) , –

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