Linux基础(02)MakeFile的创建和使用

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

猜你喜欢

转载自www.cnblogs.com/yxnrh/p/11490811.html