2016-02-02 3 views
1

Я пытаюсь получить сделать, чтобы сделать следующее с неявным правилом:Сделать неявные правила с GCC: Перенаправление * .o

obj/lsabase.o : inc/lsabase.h lsabase.c 
    cc -c lsabase.c && mv lsabase.o obj 

Я искал способы, чтобы перенаправить вывод «куб.см -с .. "с параметрами компилятора, но не нашел here.

Также неявное правило, определенное для компиляции из источника в объект, позволяет использовать только $ (CPPFLAGS) и $ (CFLAGS).

Кто-нибудь знает, как обмануть это использование (mv lsabase.o obj) в неявном правиле, поэтому я могу поместить все * .o-файлы в отдельный каталог?

ответ

2
obj/lsabase.o : inc/lsabase.h lsabase.c 
    cc -I"inc" -c lsabase.c -o obj/lsabase.o 
0

Я

  • избегают делать mv вручную, а говоря GCC поставить в obj реж
  • позволяют НКУ обрабатывать зависимости (путем создания .d файлов)

и вот что я обычно делаю, когда все мои файлы .c находятся в subdir, и я хочу скомпилировать их все в параллельном каталоге obj (что я могу легко удалить):

default: my_code 

#add subdirs 
DIRS := $(shell find src -type d) 
#add include directives for subdirs 
CFLAGS += $(DIRS:%=-I%) 

#collect all c files 
SRCS := $(shell find src/* -name \*.c) 
OBJS := $(addprefix obj/, $(SRCS:.c=.o)) 
DEPS := $(addprefix obj/, $(SRCS:.c=.d)) 

# this generates a dependency file for every .c 
obj/%.d: %.c 
    @ mkdir -p "$(@D)" 
    @ echo "Checking dependencies for $<" 
# create and modify dependecy file .d to take into account the location obj (sed magical) 
    @ gcc $(CFLAGS) -MM $< 2>/dev/null | sed -e "[email protected]\(^.*\)\.o:@obj/$(shell dirname $<)/\1.d obj/$(shell dirname $<)/\1.o:@" > [email protected] 

#this compiles 
obj/%.o : %.c 
    gcc $(CFLAGS) -c $< -o [email protected] 

#this creates the executable 
my_code: $(OBJS) 
    gcc $(OBJS) -o [email protected] $(LDFLAGS) 

# this does the magic 
-include $(DEPS) 

clean: 
    rm -rf obj 

Если вы новичок сделать, это может показаться трудным, но это действительно мощный, как только вы получите до конца.

+0

Спасибо за ваш ответ, но это своего рода продувка моей головы. Разве нет простого способа сделать то, что @dasan сделал в приведенном выше комментарии, но с неявными правилами и для каждого файла * .o? Я не мог заставить вас делать makefile, я просто получаю кучу ошибок, извините. – Tino

0

вы можете написать это правило Makefile так:

obj/lsabase.o : lsabase.c inc/lsabase.h 
<tab>cc $(CFLAGS) -c $< -o [email protected] -Iinc/. 

где, в самом Makefile, то <tab> будет заменено фактическим символ табуляции

Обратите внимание на * .c файл первый в список зависимостей, поэтому можно использовать $< ярлык

Вы упомянули желание сделать это для всех объектных файлов ..

obj/$.o : %.c inc/%.h 
<tab>cc $(CFLAGS) -c $< -o [email protected] -Iinc/. 

Однако это может быть не самым гибким. Для максимальной гибкости предложите добавить правило для создания и включения файлов зависимостей с именем .d. Затем с использованием:

obj/$.o : %.c %.d 
<tab>cc $(CFLAGS) -c $< -o [email protected] -Iinc/. 
Смежные вопросы