我正在尝试使用隐式规则来执行以下操作:
obj/lsabase.o : inc/lsabase.h lsabase.c
cc -c lsabase.c && mv lsabase.o obj
我搜索了重定向" cc -c .."的输出的方法。有编译器选项,但没有找到任何here。
此外,为从源代码到对象进行编译而定义的隐式规则只允许您使用$(CPPFLAGS)和$(CFLAGS)。
有人知道如何在隐式规则中使用此命令(mv lsabase.o obj),所以我可以将所有* .o文件放在一个单独的目录中吗?
答案 0 :(得分:2)
obj/lsabase.o : inc/lsabase.h lsabase.c
cc -I"inc" -c lsabase.c -o obj/lsabase.o
答案 1 :(得分:0)
我会
mv
,而是告诉gcc放入obj
目录.d
文件)以下是当我所有.c文件都在子目录中时我通常会做的事情,我想在并行目录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 "s@\(^.*\)\.o:@obj/$(shell dirname $<)/\1.d obj/$(shell dirname $<)/\1.o:@" > $@
#this compiles
obj/%.o : %.c
gcc $(CFLAGS) -c $< -o $@
#this creates the executable
my_code: $(OBJS)
gcc $(OBJS) -o $@ $(LDFLAGS)
# this does the magic
-include $(DEPS)
clean:
rm -rf obj
如果你是Make的新手,这可能看起来很难,但是一旦你完成它就会非常强大。
答案 2 :(得分:0)
你可以用这种方式编写makefile规则:
obj/lsabase.o : lsabase.c inc/lsabase.h
<tab>cc $(CFLAGS) -c $< -o $@ -Iinc/.
其中,在实际的makefile中,<tab>
将替换为实际的制表符
请注意* .c文件是依赖项列表中的第一个,因此可以使用$<
快捷方式
你提到想要为所有目标文件执行此操作..
obj/$.o : %.c inc/%.h
<tab>cc $(CFLAGS) -c $< -o $@ -Iinc/.
然而,这可能不是最灵活的。为了获得最大的灵活性,建议添加规则以生成和包含名为* .d的依赖项文件。然后使用:
obj/$.o : %.c %.d
<tab>cc $(CFLAGS) -c $< -o $@ -Iinc/.