Makefile 11——支持头文件目录指定
2017-05-14 13:24
501 查看
现在,是时候在对应目录放入对应文件了:
执行make后报错:
这是在构建依赖文件时,gcc因为找不到foo.h而报错。那是因为foo.h和foo.c放在不同的目录中,这样需要使用gcc的 -I 选项,指定包含路径,所以,更改后的Makefile如下:
这样就完成了支持头文件目录指定
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)
这样就完成了支持头文件目录指定
相关文章推荐
- Makefile 支持头文件目录的指定
- 快速编写“专家级”makefile(4.打造更专业的编译环境——支持头文件目录的指定)
- 把内容写入指定目录指定文件的java文件工具类,支持日期格式目录名的生成
- 扫描目录中指定后缀名的文件(支持WINDOWS跟LINUX)
- makefile依赖文件和输出文件到指定目录
- makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录
- 使用CMD模式批量删除指定目录(支持目录中多层文件夹嵌套)下指定格式文件
- makefile 将生成的目标文件和可执行文件存放在指定的目录下
- makefile 指定文件的生成目录
- 最近成果-透明加密文件系统SDK-支持透明加密解密-手动加密解密-目录加密解密-指定进程加密-指定后缀加密-指定非法进程-锁定驱动器-支持Office文件加密解密-打开文件时加密等
- Makefile中用foreach,eval,call实现将目标文件编译到指定目录 临峰不畏 发表于5个月前 原 Makefile中用foreach,eval,call实现将目标文件编译到指定目录
- Makefile中用foreach,eval,call实现将目标文件编译到指定目录
- Makefile中的wildcard函数(用来获取指定目录下的文件)
- makefile有关问题,想像vs一样将目标文件,输出文件存放在指定文件夹,而不是在源文件的目录
- 用java写了一个实用的类----递归的拷贝给定目录的.java文件到指定的一个文件中
- 将指定文件夹下的psd文件放到指定目录--内含文件批处理类
- 打开指定目录 and 打开指定文件
- asp枚举指定目录下的文件。
- 用C#列出指定目录下的所有指定扩展名(多个扩展名)的文件
- 利用Dataview实现搜索指定目录下的所有文件,以指定的条件排序(可以按文件名升降序,最后修改时间升降序)