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


    现在,是时候在对应目录放入对应文件了:

     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()!
    ");
    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)

    这样就完成了支持头文件目录指定

  • 相关阅读:
    python爬虫
    绕过CDN查找网站真实IP方法收集
    拖库
    伪静态注入的总结
    国外安全网站信息收集
    python字典去重脚本
    AOP 的利器:ASM 3.0 介绍
    JDK工具
    JVM性能调优监控工具
    DMZ
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6852291.html
Copyright © 2020-2023  润新知