《makefile学习笔记》

本文记录了makefile的简单用法,在linux上编译多个文件的c程序可以用得上。

  1. Makefile命名:Makefile或makefile
  2. makefile规则三要素:
    目标,依赖,命令
    方法1:这里我们通过简单的Makefile将下面几个文件生成可执行文件:
    首先将main.c,mul.c,add.c,calc.h放进Makefile文件夹,在文件夹创建makefile文件,内容如下(注意第二行前必须要有tab缩进):
    《makefile学习笔记》_第1张图片
    然后输入make
    在这里插入图片描述
    如果依赖文件不在本目录,在依赖文件部分要加上。

方法2:只会对修改了的文件进行编译,makefile内容如下:

app:main.o add.o mul.o
gcc main.o add.o mul.o -o app
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
mul.o:mul.c
gcc -c mul.c
《makefile学习笔记》_第2张图片
《makefile学习笔记》_第3张图片
此时修改其中的add.c文件,再make编译,只有修改了的文件被编译。
在这里插入图片描述
工作原理:
《makefile学习笔记》_第4张图片
《makefile学习笔记》_第5张图片

  1. makefile中的变量
    直接输入名称,不需要定义类型

%.o:%.c:将%替换为依赖项的名称:如main.o:main.c gcc -c $< -o $@ makefile中的自动变量:
$<:规则中的第一个依赖 $@:规则中的目标 $^:规则中的所有依赖 只能在规则的命令中使用 用变量实现第2点中方法2的makefile

obj=main.o add.o mul.o
target=app
( t a r g e t ) : (target): (target):(obj)
gcc $(obj) -o $(target)
%.o:%.c
gcc -c $< -o $@

《makefile学习笔记》_第6张图片
Makefile中自己维护的变量(大写字母):
CC=gcc (CC=默认值为cc,也就是gcc)
CPPFLAGS = -I 预处理器需要的选项如:-I
CFLAGS:编译时使用的参数 –Wall –g –c
LDFLAGS:链接库使用的选项 –L –l
使用变量方式:$(变量名)

  1. makefile中的函数(所有函数都有返回值)
    对上一个方法进行改进:

(1) 获取指定目录./下.c文件:src= ( w i l d c a r d . / ∗ . c ) ( 2 ) 把 当 前 目 录 所 有 的 . c 匹 配 为 . o 文 件 : o b j = (wildcard ./*.c) (2) 把当前目录所有的.c匹配为.o文件:obj= (wildcard./.c)2.c.oobj=(patsubst ./%.o,./%.c,$src) 修改后内容如下:

target=app
src=$(wildcard ./*.c)
obj=$(patsubst ./%.c, ./%.o, $(src))
$(target):$(obj)
        gcc $(obj) -o $(target)
%.o:%.c
        gcc -c $< -o $@

然后make:
《makefile学习笔记》_第7张图片
当再次make时可能会报make: ‘app’ is up to date.此时需要删除文件中生成的.o文件
此时可以在makefile文件中增加删除*.o文件的语句,在makefile末尾增加:

clean:
        rm $(obj) $(target)

《makefile学习笔记》_第8张图片
要执行该语句:make clean (clean之前的命令不执行)
若要强制执行某一命令,在末尾加上-f,比如在上面的makefile强制删除.o文件:

rm $(obj) $(target) –f

如果文件目录下有个新建文件和clean同名,此时make clean也会一直报make: ‘app’ is up to date.
此时需要将clean变为伪目标,在makefile修改如下(.PHONY:clean)
《makefile学习笔记》_第9张图片
如果在clean下面加入一句创建文件夹的语句:mkdir /aa ,那么在执行make clean时肯定会出错,此时在前面加上 -(即-mkdir /aa),可以在出错的情况下跳过该语句。

你可能感兴趣的:(Linux)