makefile是生成文件的脚本 , 把当前文件下的.c文件生成.o文件和可执行程序
SRC = $(wildcard *.c)
OBJS = $(patsubst %.c,%.o,$(SRC))
CC = gcc
FLAG = -g -static
LIB =
DEFS =
INCLUDE =
TARGET = helloworld
$(TARGET):$(OBJS)
$(CC) $(FLAG) $(DEFS) $^ -o $@ $(LIB)
.PHONY:
clean:
rm -rf *.o $(TARGET)
gcc -g hello.c -o hello -g后面是依赖文件 -o后面是要生成的目标文件
gcc -g -o hello hello.c可以换一下位置效果同上
-c 编译而不链接
-o 生成的文件 .c .i .s .o
-g 生成带字符表的程序
-D 快速控制代码是否执行 和#ifdefine 作用一样
-I 可指定查找include文件的其他位置 如:$cc -c -I/usr/local/include -I/opt/include hello.c
-L 指定链接库的搜索目录 , -l(小写L)指定链接库的名字
-Wall 提升警告
-g后面什么都不加就是动态链接库 -g后面加-static 静态
makefile里面的代码
目标文件:依赖文件
hello.o:hello.c
gcc -g -o hello.o hello.c
#变量
1.定义变量
OBJ = 文件名 不可追加的变量
OBJ :=可追加的变量
OBJ += 追加
2.使用变量
${} 或 $() 使用变量
3.通配符
% * ? % 任意一个 * 全部 ? 匹配 如 1?3 找到123 133 143
$@ 代表目标文件
$^ 代表依赖文件
$< 代表第一个依赖文件
要生成target要依赖于 xxx.o xxxx.o 但是没有.o文件会跳到下一句生成.o再执行生成和target和递归(到来边界才会执行下一句)差不多
object := xxx.o xxxx.o
$(target):$(object)
$(CC) $(FLAG) $^ -o $@
%.o:%.c
$(CC) $(FLAG) $^ -o $@
.PHONY:
clean:
rm -rf *.o $(target)
利用编译器的隐式规则
object := xxx.o xxxx.o
$(target):$(object)
$(CC) $(FLAG) $^ -o $@
.PHONY:
clean:
rm -rf *.o $(target)
4.隐式规则 如果你要生成 .o文件就必须要先 .c -> .i -> .s 才能生成 .o 但是编译器会智能的帮你经过中间的过程
5.函数
//$(函数名 函数参数)如:
SRC = $(wildcard *.c) //wildcard 提取当前文件下面的某个文件
OBJS = $(patsubst %.c,%.o,$(SRC)) //patsubst 字符串替换函数 把SRC里的 .c 替换成.o
CC = gcc
FLAG = -g
DEFS =
LIB = -ltermcap //-lpthread // -L/word/abc.so
INCLUDE=
$(target):$(object)
$(CC) $(FLAG) $^ -o $@ $(LIB)
.PHONY:
clean:
rm -rf *.o $(target)
#多文件makefile的使用
把顶层Makefile, Makefile.build放入程序的顶层目录 , 修改target , 修改obj-y
再在每个子文件里新建一个makefile 把obj-y+=%.o