博客地址:http://blog.youkuaiyun.com/muyang_ren
附件一:
一个可以编译文件夹内所有的C文件或指定编译某一C文件的简单makefile
使用方式1、编译所有的c文件时,只需要在文件夹下make一下,
使用方式2、只编译对应的c文件,使用:make 对应的生成文件名(不带c后缀的,但要对应有相应的c文件依赖)
使用方式3、删除可执行文件和隐藏的垃圾文件:make clean
CC = gcc
CFLAGS = -Wall -g -O0
SRC = ${wildcard *.c}
OBJS = ${patsubst %.c,%,$(SRC)}
all:$(OBJS)
%:%.c
$(CC) $(CFLAGS) $^ -o $@
clean:
@$(RM) $(OBJS) .*.sw? # .*.sw?是一种隐藏的文件
CC(预定义变量):是编译器变量,没指定时使用系统默认cc编译器,这里指定使用gcc,
CFLAGS(预定义变量):C编译器的选项,没设置时默认无选项,这里放了三个选项
-Wall :打开所有语法警告;
-g:添加可gdb调试;
-O0:这里是大写字母O和数字0,这个是使程序的优化度高一点,不过会使编译链接过程的时间更长点,小程序可以忽略时间问题,而起到优化代码的作用;
wildcard函数:获取某种文件的文件名;使用wildcard *.c的写法可以获取当前文件内所有c文件的文件名,带文件后缀;
SRC:用户自定义的变量,用来去存储wildcard 获取到的文件名(带后缀)集合
patsubst函数:实现将文件后缀修改的函数,pastubst %.c ,%,$(SRC) 则是将变量SRC中的.c文件名集转换成不带.c文件名(不带后缀)
OBJS:用户自定义变量,存储patsubst函数转换的文件名集。
all是个伪目标,因为下面没有直接跟着一个命令,依赖着OBJS中的文件名集
%:是个通配符,代表着依赖文件传递下来的内容,这里指的是文件名集。
%:%.c:也就是不带后缀的目标文件都是依赖同名带后缀的文件生成的
$():是个取变量值的运算
$^:代表着%.c传递下来的所有依赖文件
$@:代表生成的目标文件
那么可以知道:$(CC) $(CFLAGS) $^ -o $@
表达的是:gcc -Wall -O0 ( 当前文件下c文件名为目标文件名) -o (当前文件下的所有点c文件)
clean:是用户自定义的一个命令,clean的名字可以改,命令在下行,主要是实现删除指定的文件
$(RM) $(OBJS) .*.sw?
RM:是系统变量,直的是系统命令rm,OBJS也就是当前文件夹下的c文件对应的没后缀名的生成文件。
.*.sw? 则是当前目录下隐藏文件并且以sw?结尾的文件,?是指任一字符。vi的不正当关闭就会生成这种文件。
附件二:
#自动编译多个.c构成的项目,即把所有的.c编译成同一个可执行文件
CC:=gcc
CFLAGS:=-Wall -g -lpthread
SRC:=${wildcard *.c} #将当前目录下的以.c为后缀的文件名赋给SRC
OBJ:=${patsubst %.c,%.o,$(SRC)}#将Src中以.c为后缀的字符串替换成.o为后缀赋给OBJ
test:$(OBJ)
$(CC) -o $@ $^ $(CFLAGS)
%.o:%.c myhead.h
$(CC) -o $@ -c $< $(CFLAGS)
.PHONY:clean print
clean:
@rm -f *.o test .*.sw?
print:
@echo $(SRC)
@echo $(OBJ)