**
Make使用
**
直接运行make
选项
- -C dir 读入指定目录下的Makefile
- -f file 读入当前目录下的file文件作为Makefile
- -i 忽略所有的命令执行错误
- -l dir 指定被包含的Makefile所在目录
- -n 只打印要执行的命令,但不执行执行这些命令
- -p 显示make变量数据库和隐含规则
- -s 在执行命令时不显示命令
- -w 如果make在执行过程中改变目录,打印当前目录名
Makefie的隐含规则
隐含规则1:编译C程序的隐含规则
“.o的目标的依赖会自动推导为”.c",并且其生成命令是“$(CC) -C $(CPPFLAGS) ( C F L A G S ) 隐 含 规 则 2 : 链 接 o b j e c t 文 件 的 隐 含 规 则 ” < n > " 目 标 依 赖 于 “ < n > . o " , 通 过 运 行 C 的 编 译 器 来 运 行 连 接 程 序 生 成 ( ” l d " ) , 其 生 成 命 令 是 : “ (CFLAGS) 隐含规则2:链接object文件的隐含规则 ”<n>"目标依赖于“<n>.o",通过运行C的编译器来运行连接程序生成(”ld"),其生成命令是:“ (CFLAGS)隐含规则2:链接object文件的隐含规则”<n>"目标依赖于“<n>.o",通过运行C的编译器来运行连接程序生成(”ld"),其生成命令是:“(CC) $(LDFLAGS).o $(LOADLIBES) $(LDLIBS)".这个规则对于只有一个源文件的工程有效,同时也对多个object文件也生效。 - x:x.o y.o z.o
- 并且 ”x.c" “y.c” "z.c"都存在时,隐含文件将执行如下命令:
- cc -c x.c -o x.o
- cc -c y.c -o y.o
- cc -c z.c -o z.c
- cc x.o y.o z.o -o x
- 如果没有一源文件和你的目标名字相关联,那么,最好写自己的生成规则,不然,隐含规则会报错
CC=gcc
CLFAGS=-Wall -O -g
f2:f1.o f2.o main.o
.PHONY:clean
clean:
rm *.o test
Makefile的VPATH
VPATH:虚路径
- 在一些大工程中,有大量的源文件,我们通常的做法是将许多的源文件进行分类,并存放在不同的目录中。所以,当make需要去找源文件的依赖关系时,你可以在文件前加上路径,但最好的方法就是把一个路径告诉make,,让make在自动去找。
- Makefile文件中的特殊变量“VPATH"就是完成这个功能的,如果没有指明这个变量,make只会在当前的目录中去找依赖文件和目标文件。如果定义了这个变量,那,make就会在当前目录找不到的情况下,到指定的目录中去找文件了;
- VPATH=src:…/headers
- 上面的定义指定两个目录,”src“和”…/headers",make会按照这个顺序进行搜索,目录由:冒号:分割。
CC=gcc
CFLAGS=-Wall -I include
VPATH=src1:src2:main
f1:f1.o f2.o main.o
$(CC) $(CFLAGS) $^ -0 $@
.PHONY:clean
clean:
find ./-name "*o" -exec rm {}/;;rm f1
Makefile的嵌套
CC=gcc
SUBDIR=f1\
f2\
main\
obj
OBJS=f1.o f2.o main.o
BIN=myapp
OBJS_DIR=bin
export CC OBJS BIN OBJS_DIR BIN_DIR
all:CHECK_DIR $(SUBDORS)
CHECK_DIR:
mkdir -p $(BIN_DIR)
$(SUBDIRS):ECHO
make -C $@
ECHO:
@echo $(SUBDIRS)
@echo begin compile
clean:
@$(RM) $(OBJS_DIR)/*.O
@rm -rf $(BIN_DIR)