Makefile基本原则和原理

makefile中的三要素:目标、依赖、命令

目标:要生成的目标文件(在Makefile中会把第一个目标作为终极目标,一切以生成终极目标为最终目的)
依赖:生成目标文件需要的一些文件
命令:借助依赖文件生成目标文件的手段

工作原理:要生成终极目标,先检查依赖条件是否都具备,如果有依赖条件不存才则再寻找新的规则来生成依赖条件

Makefile的编写

Makefile文件命名为makefile或Makefile
第一种形式

app:main.c insert_sort.c select_sort.cgcc *.c -o app -std=c99直接使用命令生成目标文件,但是只要更新了其中的一个文件,所有文件都需要重新编译,大大浪费了时间

第二种形式

app:main.o insert_sort.o select_sort.ogcc main.o insert_sort.o select_sort.o -o appmain.o:main.cgcc main.c -c -std=c99insert_sort.o:insert_sort.cgcc insert_sort.c -c -std=c99select_sort.o:select_sort.cgcc select_sort.c -c -std=c99先生成.o文件再生成目标文件,采用链式的方法可以大大节省时间,当其中一个文件发生改变时,只用重新编译更新文件

第三种形式
可以看出第二种形式虽然解决了第一种方式中存在的问题,但代码显得非常冗余,而且可维护性差,我们可以借助makefile中的变量来进一步进行修改。

makefile中的变量分为普通变量和自动变量。
普通变量:普通变量可以用户自己定义也可以使用Linux维护的一些变量。
变量定义及赋值:obj = a.o b.o c.o
变量取值:$(obj)
由Linux系统维护的一些变量通常为大写,常见的如下所示:
CC:默认值 cc
CPPFLAGS : 预处理器需要的选项 如:-I
CFLAGS:编译的时候使用的参数 –Wall –g -c
LDFLAGS :链接库使用的选项 –L -l自动变量:
$@:规则中的目标
$<:规则中的第一个依赖条件
$^:规则中的所有依赖条件
注:上述三种自动变量只能在命令中使用模式规则:
makefile中提供了模式规则匹配
%.o:%.c
其中%表示一个或多个代码:
target = app
obj = main.o insert_sort.o select_sort.o
CC = gcc
CFLAGS = -std=c99$(target):$(obj)$(CC) $(obj) -o $(target)%.o:%.c$(CC) $< -c $(CFLAGS)现在的版本看起来已经完全不一样了,几乎没有一点之前的影子,而且也显得非常简洁。但是我们仔细观察可以发现,虽然引用了变量,但是再给变量赋值时仍然需要列出所有的依赖文件,如果文件有成百上千个,就会带来很大的麻烦!!

第四种形式

在makefile中提供了函数功能来解决上述的问题,makefile中所有的函数必须都有返回值,下面介绍几种常用的函数wildcard:查找指定目录下指定类型的文件,一个参数
用法:src = $(wildcard ./src/*.c)
注:在makefile的函数中,函数的调用方式为  函数名 参数1,参数2,参数3....patsubst:匹配替换,从src中找到所有某种格式的文件换成另一种格式
obj = $(patsubst %.c,%.o,$(src))代码:
target = app
CC = gcc
CFLAGS = -std=c99
src = $(wildcard *.c)
obj = $(patsubst %.c,%.o,$(src))$(target):$(obj)$(CC) $(obj) -o $(target)%.o:%.c$(CC) $< -c $(CFLAGS)这样整个代码就变得非常整洁、易维护了。但是如果我们想重新编译,删除.o文件,就必须手动删除,有没有办法可以使用makefile一键清空呢?

第五种形式

target = app
CC = gcc
CFLAGS = -std=c99
src = $(wildcard *.c)
obj = $(patsubst %.c,%.o,$(src))$(target):$(obj)$(CC) $(obj) -o $(target)%.o:%.c$(CC) $< -c $(CFLAGS).PHONY:clean
clean:rm $(target) $(obj) -f这里我们添加一个clean目标,我们发现这个目标没有依赖条件,我们称这样的目标为伪目标,并使用.PHONY来声明。声明它为伪目标的原因是,如果在当前目录下碰巧有一个文件名也叫clean,就会发生冲突,执行make clean时就会提示你clean目标已经处于最新状态。后面的-f参数表示强制执行该条命令,来清除报错。这样一个非常实用的makefile版本就成型了!!

Linux基础——makefile编写相关推荐

  1. Linux下Makefile编写语法

    原创 Linux下Makefile编写语法 2016-07-29 08:31:53 Datrilla 阅读数 1386更多 分类专栏: Linux Makefile 版权声明:本文为博主原创文章,遵循 ...

  2. linux下MaKefile编写

    Linux下编写 makefile 详细教程 近期在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是goo ...

  3. linux 建立伪目标过程,linux之Makefile 编写、规则、伪目标、变量

    什么是Makefile?首先,make是一个工具程序(Utility software),是一种控制编译或者重复编译软件的工具:make可以自动管理软件编译的内容.方式和时机从而使程序员能够把精力集中 ...

  4. 【linux】Makefile编写

    1.在linux环境下使用GNU的make工具能够比较容易构建一个属于自己的工程 ,整个工程的编译只需要一个命令就可以完成编译.链接.这依赖于Makefile 文件. 2.Makefile的用途    ...

  5. 【开发工具】之linux下makefile编写

    序 在实际工程中,我们通常使用makefile来构建目标文件,本文旨在示例一个简单的makefile,可根据实际需要更改. 1. 配置相关的宏在config.mk中 新建config,mk #检测系统 ...

  6. Linux下面makefile编写

    源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器.   下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c或者 ...

  7. Linux平台Makefile文件的编写基础篇和GCC参数详解

    问:gcc中的-I.是什么意思....看到了有的是gcc -I. -I/usr/xxxxx..那个-I.是什么意思呢 最佳答案 答:-Ixxx 的意思是除了默认的头文件搜索路径(比如/usr/incl ...

  8. Linux编写脚本查看mod,Linux shell脚本编写基础

    在进行linux测试时编写脚本是必不可少的,Shell脚本的名称可以随便定义,也不要什么后缀名,例如可以写abc,smartzip这类名称,运行时只要键入 ./smartzip就能运行脚本了.. 每行 ...

  9. linux 生成和使用动态链接库和静态链接库的Makefile编写

    引用 Jesse Rei 的 linux 生成和使用动态链接库和静态链接库的Makefile编写 生成和使用动态链接库和静态链接库的Makefile编写 1. 概述 介绍linux下生成和使用动态链接 ...

最新文章

  1. 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索
  2. 一种安全的static变量Get/Set方式
  3. javascript 传值给前端(ios 安卓)
  4. C++ Primer 5th笔记(chap 11)关联容器操作
  5. MyEclipse使用总结——MyEclipse去除网上复制下来的来代码带有的行号
  6. mysql 配置文件my-default.cnf
  7. k8s nod rc service 使用
  8. 嵌入式系统TinyOS学习资源
  9. Vagrant 构建 LNMP 一致环境
  10. typescript之hasOwnProperty
  11. petshop 数据库
  12. [转]abstract 抽象类的概念和使用
  13. mysql replace into 异常1365 - Division by 0
  14. 对比苏州和杭州这两座城市,你会发现?
  15. 软碟通 (UltraISO)制作启动盘
  16. i5 6600 HD530联想扬天S5250黑苹果
  17. platform.js
  18. 章节三:BeautifulSoup
  19. 遍历指定目录下指定类型文件的函数(fatkun Fix版)
  20. 转:pdf密码破解专题

热门文章

  1. CAN详解--CAN与com口介绍
  2. TCP三次握手四次挥手简介
  3. oracle连接数据库的jar包(ojdbc10.jar,ojdbc8.jar,ojdbc6.jar)
  4. 产品周报第29期|创作中心优化:发文助手新增质量分检测功能,博文增加内容历史版本
  5. 电脑便签小工具分享 居然可以这般贴心好用
  6. Redis6客户端工具——Jedis
  7. 某程序员哀叹:做码农真的很悲哀,有的35岁就没人要了
  8. Visual Studio 2019 (VS2019)安装Spy++工具
  9. C++对象模型-在对象模型的尖端 第七章笔记
  10. 业务运营支撑系统  BOSS(Business Operation Support System)。