我正在为我的项目编写通用makefile。我想要做的是提供一个对象列表,并自动编译它们。这是一个简单的makefile:
OBJS=\
main.o \
more_stuff.o \
and_even_more_stuff.o \
all: $(OBJS)
ld $(OBJS) -o some_library.so
%.o: %.c
gcc $< -o $@
正如您所看到的,它所做的就是遍历所有对象,检查相关源文件是否存在,然后编译它。
这很有效,但是一旦我尝试将东西放入子目录中,它就不再起作用了:
OBJS=\
src/main.o \
src/foo/more_stuff.o \
src/bar/and_even_more_stuff.o \
all: $(OBJS)
ld $(OBJS) -o some_library.so
# These targets no longer exist?
%.o: %.c
gcc $< -o $@
为了使其工作,我必须为每个目录创建一个新目标...
OBJS=\
src/main.o \
src/foo/more_stuff.o \
src/bar/and_even_more_stuff.o \
all: $(OBJS)
ld $(OBJS) -o some_library.so
src/%.o: src/%.c
gcc $< -o $@
src/foo/%.o: src/foo/%.c
gcc $< -o $@
src/bar/%.o: src/bar/%.c:
gcc %< -o $@
这很有效,但它丑陋而烦人......我怎样才能为所有对象(在每个目录中)定义一个目标?
希望这是有道理的!