makefile文件编写教程
技术交流QQ群:1027579432,欢迎你的加入!
1.make介绍
- gcc:编译器(gcc根据菜谱进行编译)
- make: linux自带的构建器(相当于一个菜谱)
- 构建的规则(菜谱)在makefile中
2.makefile文件的命名
- makefile
- Makefile
3.makefile中的规则
- gcc a.c b.c c.c -o app这种方法在文件很多情况下,利用gcc编译时会有很多参数,不利于整个项目的管理。因此,需要编写makefile文件,便于整个项目的编译。
- makefile中的规则组成:目标,依赖,命令,具体格式如下:
目标:依赖 (tab缩进) 命令
- 将gcc a.c b.c c.c -o app修改为make进行编译。于是,makefile中的规则如下所示:
app:a.c b.c c.cgcc a.c b.c c.c -o app
- makefile中由一条或多条规则组成!
4.makefile的编写
- 具体实例如下所示,第一个版本:
// gcc编译 cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ls add.c head.h main.c mul.c sub.c cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ gcc add.c main.c sub.c -o app cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app sum=36 cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ rm app// make编译 cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile app:add.c main.c sub.cgcc add.c main.c sub.c -o app cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ls add.c head.h main.c makefile mul.c sub.c cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make gcc add.c main.c sub.c -o app cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app sum=36
- 第一个版本的缺点:编译步骤花费时间很长,效率低,修改其中一个文件,所有文件会被重新编译。
- 具体实例如下所示,第二个版本:
cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile app:add.o main.o sub.ogcc add.o main.o sub.o -o appadd.o:add.cgcc add.c -cmain.o:main.cgcc main.c -csub.o:sub.cgcc sub.c -c cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ rm app cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make gcc add.c -c gcc main.c -c gcc sub.c -c gcc add.o main.o sub.o -o app cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app sum=36 cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim add.c # 仅对add.c文件增加一个空行! cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make gcc add.c -c gcc add.o main.o sub.o -o app
- makefile工作原理:
- 检测依赖(如第二个版本中的add.o main.o sub.o)是否存在:
- 向下搜索下面的规则(如第二个版本中的add.o:add.c gcc add.c -c),如果有规则是用来生成查找的依赖(如第二个版本中的add.o main.o sub.o)的,执行规则中的命令;
- 依赖存在,判断是否需要更新:
- 原则:目标的时间 > 依赖的时间。反之,则更新。(如第二个版本中vim add.c,仅对add.c文件增加一个空行!make时只对add.c进行编译)
- 检测依赖(如第二个版本中的add.o main.o sub.o)是否存在:
- 第二个版本的缺点:makefile文件中有很多内容是冗余的。
- 具体实例如下所示,第三个版本:
- 自定义变量:obj=a.o b.o c.0
- 变量的取值:aa=$(obj)
- makefile自带的变量:大写
- CPPFLAGS
- CC
- 自动变量:自动变量只能在规则的命令中使用!
- $@:规则中的目标
- $<:规则中的第一个依赖
- $^:规则中所有的依赖
dl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile obj = add.o main.o sub.o target = app $(target):$(obj)gcc $(obj) -o $(target) # 也可以使用自动变量gcc $^ -o $@%.o:%.cgcc -c $< -o $@ cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ rm *.o cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make cc -c -o add.o add.c cc -c -o main.o main.c cc -c -o sub.o sub.c gcc add.o main.o sub.o -o app
- 自定义变量:obj=a.o b.o c.0
- 模式匹配:%.o:%.c
- 第一次:add.o没有
add.o:add.cgcc -c add.c -o add.o
- 第二次:main.o没有
main.o:main.cgcc -c main.c -o main.o
5.makefile中的函数
- 第三个版本的缺点:可移植性比较差。
- 具体实例如下所示,第四个版本:
- makefile中的所有函数都是有返回值
- wildcard查找指定目录下的指定类型的文件(如 ./.c):src = $(wildcard ./.c)
- 匹配替换:obj = $(patsubst %.c, %.o, $(src))
cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile src = $(wildcard ./*.c) obj = $(patsubst %..c, %..o, $(src)) target = app $(target):$(obj)gcc $^ -o $@%..o:%..cgcc -c $< -o $@ cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make gcc mul.c main.c add.c sub.c -o app cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app sum=36
6.makefile中添加项目清理功能
- 第四个版本的缺点:不能清理项目。
- 具体实例如下所示,第五个版本:
- 让make生成不是终极目标的目标:make 目标名
- 编写一个清理项目的规则:
clean:rm *.o app
- 声明伪目标:
.PHONY:clean
- -f:强制执行
- 命令前加-:忽略执行失败的命令,继续向下执行其余的命令;
cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile src = $(wildcard ./*.c) obj = $(patsubst %..c, %..o, $(src)) target = app $(target):$(obj)gcc $^ -o $@%..o:%..cgcc -c $< -o $@ .PHONY:clean clean:-mkdir /abc -rm $(obj) $(target) -f
makefile文件编写教程相关推荐
- 基础知识(三)makefile文件编写初级篇
linux下进行c++开发,需要熟悉相关编译器的编译.链接命令.这边主要以实例讲解,如何在linux中,进行c++程序简单的编译链接运行. 一.单文件编译链接 这里先从最简单的单个文件编译链接为例.在 ...
- SYNOPSYS VCS Makefile文件编写与研究
SYNOPSYS VCS Makefile文件编写与研究 这个Makefile是synopsys提供的模板,看上去非常好用,你只要按部就班提供实际项目的参数就可以了.我们来看这个文件的头部说明: ma ...
- Linux编程——入门级Makefile文件编写
前言 1.在Linux开发环境中,编写Makefile文件是一个必须的技能,虽然现在有好多IDE可以自动生成所需要的Makefile文件,但有时能看懂Makefile文件也是更好的了解项目的编译过程. ...
- 从简入难makefile文件编写,Linux C++编程,简单vi命令
1.一个最基本的C++程序 2.第二个c++程序 3.第一个入门级别的简单的makefile 4.在makefile中定义变量. 5.编写makefile的依赖 如果start:标识后面的某个. ...
- makefile文件编写_九图记住Makefile
本文首次编辑时间2020.07.20 最后编辑时间2020.08.03 欢迎转载,转载请附上原文链接 参考: GNU make说明文档:https://www.gnu.org/software/mak ...
- makefile文件编写
makefile文件用于管理和组织代码工程的编译和链接,其不是可执行文件,其被make工具解析并完成相关动作,下面笔者将介绍makefile中常用的一些语法说明: 1.文件包含: 语法:include ...
- 简单的makefile文件编写
习惯了windows下ide创建工程已经代码的编写,然后一键运行,很简单,因为很多事ide都帮我们做了,但是linux下不一样,需要手动编译,执行一条条的命令,一般工程都是由于很多文件组成的,比如c+ ...
- Makefile文件编写规则
From: http://aviva.iteye.com/blog/807494 Makefile中包含五种内容:显式规则,隐式规则,变量定义,指令(directive)和注释. 1.显式规则――描述 ...
- C++库文件和头文件编写教程
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 「本文介绍了在Linux系统下生成库文件,以及编写头文件来使用该库 ...
最新文章
- [EnterpriseServices]利用assembly定义我们的组件在COM+中的注册方式
- Ngrok: 使用 Ngrok 实现内网穿透
- 笔记-信息系统开发基础-uml-uml类图关系
- mysql如何获取当前时间
- 微信小程序 设置背景占满整个页面
- 太阳能板清洗机器人科沃斯_太阳能电池板清洁机器人
- linux挂载iso镜像进系统,linux可以加载iso镜像文件到启动项吗
- ASP.NET Core:从ASP.NET Web API迁移的多层数据服务应用程序
- SAP License:SAP Solution Manager中的常用命令
- 词汇表生成(C语言)
- 水晶报表基础入门——4.水晶报表排序、分组技术
- lasted是什么意思_lasted是什么意思_lasted怎么读_lasted翻译_用法_发音_词组_同反义词_继续存在( last的过去式和过去分词 )-新东方在线英语词典...
- 解决:另一个 SqlParameterCollection 中已包含 SqlParameter。
- 服务器恶意发包行为排查
- Twaver-HTML5基础学习(12)连线(Link)
- UDE2021开展首日回顾,“黑科技”含量超标了!
- Mac和Windows系统中ssh密钥的生成和共享
- sci四区大水刊 计算机,sci四区大水刊_sci四区免费大水刊_sci四区什么水平
- 使用猿如意体验【ChatGPT】
- RISC-V 指令架构 -- 模式切换
热门文章
- ZOJ-1654 Place the Robots---二分图最小点覆盖+构图
- LINUX应用与发展简介
- ADO.NET 常用对象(18)
- JavaScript Array 对象方法
- 控制C++的内存分配
- 网易2017校招编程:计算糖果
- Beyond MySQL --Branching the popular database--转载
- rsyslog概要以及源码安装mysql,rsyslog输出到Mysql基于loganalyzer查看分析
- android TranslateAnimation动画执行时的坐标获取。
- 主题:windows 如何查看端口占用情况?