当前位置: 首页 > news >正文

关于makefile

makefile功能

make工具最主要的功能就是通过编写makefile文件来描述源程序之间相互关系,并且自动维护编译工作
在UNIX系统中习惯使用Makefile作为makefile文件,如果要使用其他文件,例如libXXXX.mk就需要通过参数-f来指定我们的makefile文件

make -f libXXXX.mk

书写规则(依赖关系、生成目标方法)

targets:prerequistes
	command

例如:

main:main.c
	gcc main.c -o main

targets是我们最终想要得到的目标文件名
command是得到最终文件所需要执行的命令
prerequistes是获取目标文件的先决条件(源文件)

如果我们想定义一系列比较类似的文件就可以使用通配符例如:

clean:
	rm -f *.o
clean:
	cat main.c
	rm -f *.o

wildcard和patsubst

如果使用通配符表示一系列文件并且赋值给变量例如

object = *.c

object的值将会是*.c,并不会是*.c文件的展开,如果需要表示.c文件基于需要使用wildcard函数这样就能使object表示为.c文件的名的集合

object = ${wildcard *.c}

而patsubst的名称为模式字符串替换函数

${patsubst <pattern>, <replacement>, <text>}

含义为在<text>中单词(以空格、换行、tab分隔)是否符合模式<pattern>如果模式匹配就使用<replacement>替换(可以包含通配符%)

src = ${wildcard *.c}
obj = ${patsubst %.c, %.o, ${src}}

伪目标

clean:
	rm -f *.o

伪目标不是一个文件,只是一个标签,所以make无法生成它的依赖关系和是否执行,我们只有显示的指明这个目标才能让其生效,为了避免和文件重名我们可以使用一个特殊符号.PHONY来显式指明一个目标就是伪目标,向make说明不管是否有这个文件这个目标就是伪目标,只要有这个声明不管是否有这个文件要运行clean就可以make clean使用

.PHONY : clean
clean :
	rm *.o temp

变量和自动变量

在makefile中变量用作$(obj)(常用)或${obj}, #表示注释
$@:在规则命令中,表示规则中的目标
$^:在规则命令中,表示所有依赖条件
$<:在规则命令中,第一个依赖条件(如果应用在模式规则中,可以将依赖条件列表中的依赖依次取出,套用模式规则)

main:main.c
	gcc main.c -o main
main:main.c
	gcc main.c -o $@
main:main.c
	gcc $^ -o $@
main:main.c
	gcc $< -o $@
ALL:main
WALL = -Wall
CC = gcc
src = $(wildcard *.c)
obj = $(patsubst %.c, %.o, $(src))
main:$(obj)
	$(CC) $^ -o $@ $(WALL)
%.o:%.c
	$(CC) -c $< -o $@
.PHONY:clean
clean:
	rm -rf *.o main

相关文章:

  • C语言 变量的存储和引用,内部和外部函数
  • 仿真1 - takeoff_land
  • 基于C语言的图论汇编
  • 非自交任意多边形与矩形框的交集面积计算方法
  • 软件测试项目实战,Web测试常用测试点,即拿即用宝典
  • i.MX 6ULL 驱动开发 九:中断
  • typename 的用法
  • java题2
  • 【Python深度学习】深度学习框架搭建模版
  • 双绞线连接网卡和集线器时的制作步骤
  • vue实战-mockjs模拟数据
  • 深度学习优化算法之动量法[公式推导](MXNet)
  • tomcat面试和Spring的面试题
  • 网课查题公众号接口
  • 基于Hive的搜狗搜索日志与结果Python可视化设计
  • Electron入门介绍
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Java多态
  • js递归,无限分级树形折叠菜单
  • MySQL用户中的%到底包不包括localhost?
  • Octave 入门
  • 编写符合Python风格的对象
  • 从tcpdump抓包看TCP/IP协议
  • 关于Java中分层中遇到的一些问题
  • 前端性能优化--懒加载和预加载
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 什么是Javascript函数节流?
  • 使用API自动生成工具优化前端工作流
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • (04)odoo视图操作
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (3)选择元素——(17)练习(Exercises)
  • (C语言)二分查找 超详细
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (四)Controller接口控制器详解(三)
  • (四)Linux Shell编程——输入输出重定向
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)创业家杂志:UCWEB天使第一步
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .Net - 类的介绍
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net refrector
  • @Transaction注解失效的几种场景(附有示例代码)
  • []我的函数库
  • [《百万宝贝》观后]To be or not to be?
  • [Angularjs]ng-select和ng-options
  • [C++]Leetcode17电话号码的字母组合
  • [Contest20180313]灵大会议
  • [echarts] y轴不显示0
  • [HeadFrist-HTMLCSS学习笔记][第一章Web语言:开始了解HTML]
  • [I2C]I2C通信协议详解(二) --- I2C时序及规格指引