使用GCC制定隐式规则:重定向* .o

时间:2016-02-02 10:45:32

标签: c gcc makefile

我正在尝试使用隐式规则来执行以下操作:

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文件放在一个单独的目录中吗?

3 个答案:

答案 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目录
  • 让gcc处理依赖项(通过创建.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/.