您的位置:首页 > 其它

Makefile 11——支持头文件目录指定

2017-05-14 13:24 501 查看
现在,是时候在对应目录放入对应文件了:

1 /×    foo.h     */
2
3 #ifndef __FOO_H
4 #define __FOO_H
5
6 void foo(void)
7
8 #endif/*__FOO_H*/
9
10
11 /*    foo.c     */
12
13 #include <stdio.h>
14 #include "foo.h"
15 void foo(void)
16 {
17     printf("This is foo()!\n");
18 }
19
20 /*     main.c   */
21
22 #include "foo.h"
23 int main(void)
24 {
25     return 0;
26 }


执行make后报错:



这是在构建依赖文件时,gcc因为找不到foo.h而报错。那是因为foo.h和foo.c放在不同的目录中,这样需要使用gcc的 -I 选项,指定包含路径,所以,更改后的Makefile如下:

1 .PHONY: all clean
2
3 MKDIR = mkdir
4 RM = rm
5 RMFLAGS =-rf
6
7 CC = gcc
8 AR = ar
9 ARFLAGS = crs
10
11 DIR_OBJS = objs
12 DIR_EXES = $(ROOT)/build/exes
13 DIR_DEPS = deps
14 DIR_LIBS = $(ROOT)/build/libs
15 DIRS = $(DIR_OBJS) $(DIR_EXES) $(DIR_DEPS) $(DIR_LIBS)
16 RMS = $(DIR_OBJS) $(DIR_DEPS)
17
18 ifneq ("$(EXE)", "")
19 EXE := $(addprefix $(DIR_EXES)/, $(EXE))
20 RMS += $(EXE)
21 endif
22
23 ifneq ("$(LIB)", "")
24 LIB := $(addprefix $(DIR_LIBS)/, $(LIB))
25 RMS += $(LIB)
26 endif
27
28 SRCS = $(wildcard *.c)
29 OBJS = $(SRCS:.c=.o)
30 OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))
31 DEPS = $(SRCS:.c=.dep)
32 DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS))
33
34 ifeq ("$(wildcard $(DIR_OBJS))", "")
35 DEP_DIR_OBJS := $(DIR_OBJS)
36 endif
37 ifeq ("$(wildcard $(DIR_EXES))", "")
38 DEP_DIR_EXES := $(DIR_EXES)
39 endif
40 ifeq ("$(wildcard $(DIR_DEPS))", "")
41 DEP_DIR_DEPS := $(DIR_DEPS)
42 endif
43 ifeq ("$(wildcard $(DIR_LIBS))", "")
44 DEP_DIR_LIBS := $(DIR_LIBS)
45 endif
46
47 all: $(EXE) $(LIB)
48
49 ifneq ($(MAKECMDGOALS), clean)
50 include $(DEPS)
51 endif
52
53 ifneq ("$(INCLUDE_DIRS)", "")
54 INCLUDE_DIRS := $(strip $(INCLUDE_DIRS))
55 INCLUDE_DIRS := $(addprefix -I, $(INCLUDE_DIRS))
56 endif
57
58 $(DIRS):
59     $(MKDIR) $@
60 $(EXE): $(DEP_DIR_EXES) $(OBJS)
61     $(CC) -o $@ $(filter %.o, $^)
62 $(LIB): $(DEP_DIR_LIBS) $(OBJS)
63     $(AR) $(ARFLAGS) $@ $(filter %.o, $^)
64 $(DIR_OBJS)/%.o: $(DEP_DIR_OBJS) %.c
65     $(CC) $(INCLUDE_DIRS) -o $@ -c $(filter %.c, $^)
66 $(DIR_DEPS)/%.dep: $(DEP_DIR_DEPS) %.c
67     @echo "Creating $@ ..."
68     @set -e ; \
69     $(RM) $(RMFLAGS) $@.tmp ; \
70     $(CC) $(INCLUDE_DIRS) -E -MM $(filter %.c, $^) > $@.tmp ; \
71     sed 's,\(.*\)\.o[ :]*,objs/\1.o $@: ,g' < $@.tmp > $@ ; \
72     $(RM) $(RMFLAGS) $@.tmp
73 clean:
74     $(RM) $(RMFLAGS) $(RMS)




这样就完成了支持头文件目录指定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐