Linux基础——makefile编写
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编写相关推荐
- Linux下Makefile编写语法
原创 Linux下Makefile编写语法 2016-07-29 08:31:53 Datrilla 阅读数 1386更多 分类专栏: Linux Makefile 版权声明:本文为博主原创文章,遵循 ...
- linux下MaKefile编写
Linux下编写 makefile 详细教程 近期在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是goo ...
- linux 建立伪目标过程,linux之Makefile 编写、规则、伪目标、变量
什么是Makefile?首先,make是一个工具程序(Utility software),是一种控制编译或者重复编译软件的工具:make可以自动管理软件编译的内容.方式和时机从而使程序员能够把精力集中 ...
- 【linux】Makefile编写
1.在linux环境下使用GNU的make工具能够比较容易构建一个属于自己的工程 ,整个工程的编译只需要一个命令就可以完成编译.链接.这依赖于Makefile 文件. 2.Makefile的用途 ...
- 【开发工具】之linux下makefile编写
序 在实际工程中,我们通常使用makefile来构建目标文件,本文旨在示例一个简单的makefile,可根据实际需要更改. 1. 配置相关的宏在config.mk中 新建config,mk #检测系统 ...
- Linux下面makefile编写
源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c或者 ...
- Linux平台Makefile文件的编写基础篇和GCC参数详解
问:gcc中的-I.是什么意思....看到了有的是gcc -I. -I/usr/xxxxx..那个-I.是什么意思呢 最佳答案 答:-Ixxx 的意思是除了默认的头文件搜索路径(比如/usr/incl ...
- Linux编写脚本查看mod,Linux shell脚本编写基础
在进行linux测试时编写脚本是必不可少的,Shell脚本的名称可以随便定义,也不要什么后缀名,例如可以写abc,smartzip这类名称,运行时只要键入 ./smartzip就能运行脚本了.. 每行 ...
- linux 生成和使用动态链接库和静态链接库的Makefile编写
引用 Jesse Rei 的 linux 生成和使用动态链接库和静态链接库的Makefile编写 生成和使用动态链接库和静态链接库的Makefile编写 1. 概述 介绍linux下生成和使用动态链接 ...
最新文章
- 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索
- 一种安全的static变量Get/Set方式
- javascript 传值给前端(ios 安卓)
- C++ Primer 5th笔记(chap 11)关联容器操作
- MyEclipse使用总结——MyEclipse去除网上复制下来的来代码带有的行号
- mysql 配置文件my-default.cnf
- k8s nod rc service 使用
- 嵌入式系统TinyOS学习资源
- Vagrant 构建 LNMP 一致环境
- typescript之hasOwnProperty
- petshop 数据库
- [转]abstract 抽象类的概念和使用
- mysql replace into 异常1365 - Division by 0
- 对比苏州和杭州这两座城市,你会发现?
- 软碟通 (UltraISO)制作启动盘
- i5 6600 HD530联想扬天S5250黑苹果
- platform.js
- 章节三:BeautifulSoup
- 遍历指定目录下指定类型文件的函数(fatkun Fix版)
- 转:pdf密码破解专题
热门文章
- CAN详解--CAN与com口介绍
- TCP三次握手四次挥手简介
- oracle连接数据库的jar包(ojdbc10.jar,ojdbc8.jar,ojdbc6.jar)
- 产品周报第29期|创作中心优化:发文助手新增质量分检测功能,博文增加内容历史版本
- 电脑便签小工具分享 居然可以这般贴心好用
- Redis6客户端工具——Jedis
- 某程序员哀叹:做码农真的很悲哀,有的35岁就没人要了
- Visual Studio 2019 (VS2019)安装Spy++工具
- C++对象模型-在对象模型的尖端 第七章笔记
- 业务运营支撑系统 BOSS(Business Operation Support System)。