标签:makefile
【版权声明:转载请保留出处:blog.csdn.net/gentleliu。Mail:shallnew at 163 dot com】lib : $(OBJDIR) $(LIBDIR)/$(SRC_LIB) bin : $(OBJDIR) $(BINDIR)/$(SRC_BIN) $(OBJDIR) : >---@echo " MKDIR $(notdir $@)..." >---@mkdir -p $@ ifneq ($(SRC_BIN),) $(BINDIR)/$(SRC_BIN) : $(SRC_OBJ) >---$(CC) -o $@ $^ $(LDFLAGS) endif ifneq ($(SRC_LIB),) $(LIBDIR)/$(SRC_LIB) : $(SRC_OBJ) >---$(AR) rcs $@ $^ >---cp $@ $(SRC_BASE)/libs endif
build/ └── unix_dbg ├── bin │ └── target_bin ├── lib │ ├── libipc.a │ └── libtools.a └── obj ├── ipc ├── main └── tools
SRC_BASE = ../.. CFLAGS += CPPFLAGS += -I. -I./inc -I$(SRC_BASE)/include # SRC_OBJ = $(patsubst %.c, %.o, $(wildcard *.c)) SRC_FILES = $(wildcard src/*.c) SRC_OBJ = $(SRC_FILES:.c=.o) SRC_LIB = xx.a include $(SRC_BASE)/Makefile.rule
# make make[1]: Entering directory `/home/Myprojects/example_make/version-2.9/src/ipc' make[1]: *** No rule to make target `../../build/unix_dbg/obj/ipc/ipc.o', needed by `../../build/unix_dbg/lib/libipc.a'. Stop. make[1]: Leaving directory `/home/Myprojects/example_make/version-2.9/src/ipc' make: *** [ipc] Error 2 #
%.o: %.c # commands to execute (built-in): >---$(COMPILE.c) $(OUTPUT_OPTION) $<因为所有的.o目标符合该规则,所以会自动推导生成.o文件。我们现在在..o前面加上路径后没有符合生成.o的隐含模式规则了,所以就没有生成该文件,导致编译出错。那怎么办呢?没有隐含模式规则,我们可以自己写符合生成该目标的模式规则。
$(OBJDIR)/%.o : %.c >---$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@该模式规则中目标文件是$(OBJDIR)/%.o,那么现在有了符合生成我们需要的.o文件的规则了,编译一下:
# make make[1]: Entering directory `/home/Myprojects/example_make/version-2.9/src/ipc' make[1]: *** No rule to make target `../../build/unix_dbg/obj/ipc/ipc.o', needed by `../../build/unix_dbg/lib/libipc.a'. Stop. make[1]: Leaving directory `/home/Myprojects/example_make/version-2.9/src/ipc' make: *** [ipc] Error 2 #发现还是不对,不是已经增加了模式规则了吗,为何还是没有生成.o文件。
<targets ...>: <target-pattern>: <prereq-patterns ...> <commands> ....比如下面是一个静态模式规则:
objects = foo.o bar.o all: $(objects) $(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@该规则描述了所有的.o文件的依赖文件为对应的.c文件,对于目标“foo.o” ,取其茎“foo”替代对应的依赖模式“%.c”中的模式字符“%”之后可得到目标的依赖文件“foo.c”。这就是目标“foo.o”的依赖关系“foo.o: foo.c”,规则的命令行描述了如何完成由“foo.c”编译生成目标“foo.o” 。命令行中“$<”和“$@”是自动化变量,“$<” 表示规则中的第一个依赖文件, “$@” 表示规则中的目标文件。上边的这个规则描述了以下两个具体的规则:
foo.o : foo.c >---$(CC) -c $(CFLAGS) foo.c -o foo.o bar.o : bar.c >---$(CC) -c $(CFLAGS) bar.c -o bar.o(注:该示例与其相关描述摘抄于互联网,描述很不错,估计比我讲的详细)
$(SRC_OBJ) : $(OBJDIR)/%.o : %.c >---$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@执行后:
# make make[1]: Entering directory `/home/Myprojects/example_make/version-2.9/src/ipc' make[1]: *** No rule to make target `ipc.c', needed by `../../build/unix_dbg/obj/ipc/ipc.o'. Stop. make[1]: Leaving directory `/home/Myprojects/example_make/version-2.9/src/ipc' make: *** [ipc] Error 2 #发现提示没有文件ipc.c,这说明没有生成.o的原因是没有.c文件,我很好奇的是为何使用非静态模式为何不提示呢?(还没搞懂,再研究研究,知道的可以给个提示哈~~)
标签:makefile
原文地址:http://blog.csdn.net/shallnet/article/details/38070745