Linux C应用编程-2-Makefile编写

news2024/11/15 11:14:48

1.基本规则

#规则格式
target ... : prerequisites ... 
    command1
    command2
    
#例如
main: main.o stack.o maze.o
    gcc main.o stack.o maze.o -o main
  • main是规则的目标(Target),main.ostack.omaze.o是规则的条件(Prerequisite),command是规则的命令列表。

  • 目标和条件之间的关系是:欲更新目标,必须首先更新它的所有条件;所有条件中只要有一个条件被更新了,目标也必须随之被更新。

  • 如果一个目标拆开写多条规则,则只有一条规则允许有命令列表,其它规则不能有命令列表,否则make会报警告并且采用最后一条规则的命令列表。

  • “更新”就是执行一遍规则中的命令列表(commands),命令列表中的每条命令必须以一个Tab开头。

make执行步骤

  1. 尝试更新Makefile中第一条规则的目标main,第一条规则的目标称为缺省目标,只要缺省目标更新了就算完成任务了,其它工作都是为这个目的而做的。由于是第一次编译,main文件还没生成,显然需要更新,但规则说必须先更新了main.ostack.omaze.o这三个条件,然后才能更新main

  2. 所以make会进一步查找以这三个条件为目标的规则,这些目标文件也没有生成,也需要更新,所以执行相应的命令(gcc -c main.cgcc -c stack.cgcc -c maze.c,通过隐含规则)更新它们。

  3. 最后执行gcc main.o stack.o maze.o -o main更新main

                                                       Makefile的依赖关系图

2.隐含规则与模式规则

  • 如果一个目标在Makefile中的所有规则都没有命令列表,make会尝试在内建的隐含规则(Implicit Rule)数据库中查找适用的规则。

  • make的隐含规则数据库可以用make -p命令打印,也是Makefile的格式,包括很多变量和规则。如:

    #通过.c文件编译出.o文件的默认规则
    ​
    # default
    OUTPUT_OPTION = -o $@
    ​
    # default
    CC = cc
    ​
    # default
    COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
    ​
    %.o: %.c
    #  commands to execute (built-in):
            $(COMPILE.c) $(OUTPUT_OPTION) $<

    $@的取值为规则中的目标,$<的取值为规则中的第一个条件。

    %.o: %.c是一种特殊的规则,称为模式规则(Pattern Rule)。

3.伪目标

伪目标是一个标签,这个目标只执行命令,不创建目标,能避免目标与工作目录下的实际文件名冲突。

PHONY:标签

例如将 all 设置为伪目标后,尽管在当前目录下有同名的 all 文件,但是在终端输入 make 命令, all 的命令会被正确执行。

4.变量

foo = $(bar) 
bar = Huh? 
​
all: 
    @echo $(foo)
​
#在调用变量是才会把变量$(bar) 展开

1)自动变量(隐含规则变量)

自动变量含义
$@规则的目标文件名
$<规则的目标的第一个依赖文件名
$^规则的目标所对应的所有依赖文件的列表,以空格分隔
$?规则的目标所对应的依赖文件新于目标文件的文件列表,以空格分隔
$(@D)规则的目标文件的目录部分(如果目标在子目录中)
$(@F)规则的目标文件的文件名部分(如果目标在子目录中)

2)预定义变量(隐含规则变量)

预定义变量含义
AR归档维护程序,默认值为 ar
AS汇编程序,默认值为 as
CCC 语言编译程序,默认值为 cc
CPPC 语言预处理程序,默认值为 cpp
RM文件删除程序,默认值为 rm -f
ARFLAGS传递给 AR 程序的标志,默认为 rv
ASFLAGS传递给 AS 程序的标志,默认值无
CFLAGS传递给 CC 程序的标志,默认值无。编译选项,例如-O-g
CPPFLAGS传递给 CPP 程序的标志,默认值无。预处理选项,例如-D-I
LDFLAGS传递给链接程序的标志,默认值无

5.常用make命令行选项

1)-C

  • -C选项可以切换到另一个目录执行那个目录下的Makefile。

  • 一些规模较大的项目会把不同的模块或子系统的源代码放在不同的子目录中,然后在每个子目录下都写一个该目录的Makefile,然后在一个总的Makefile中用make -C命令执行每个子目录下的Makefile。如Linux内核源代码。

ARCH ?=
CROSS_COMPILE ?= mipsel-openwrt-linux-gnu-
export
​
### general build targets
​
all:
    $(MAKE) all -e -C libloragw
    $(MAKE) all -e -C util_pkt_logger
    $(MAKE) all -e -C util_spi_stress
    $(MAKE) all -e -C util_tx_test
    $(MAKE) all -e -C util_lbt_test
    $(MAKE) all -e -C util_tx_continuous
    $(MAKE) all -e -C util_spectral_scan
​
clean:
    $(MAKE) clean -e -C libloragw
    $(MAKE) clean -e -C util_pkt_logger
    $(MAKE) clean -e -C util_spi_stress
    $(MAKE) clean -e -C util_tx_test
    $(MAKE) clean -e -C util_lbt_test
    $(MAKE) clean -e -C util_tx_continuous
    $(MAKE) clean -e -C util_spectral_scan
​
### EOF

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

  

6.实例

文件目录

$ tree
.
├── makefile
├── testadd
│   ├── add.c
│   └── add.h
├── test.c
├── test.h
└── testsub
    ├── sub.c
    └── sub.h

Makefile文件

# 预定义变量 指令编译器和选项
CC = gcc            #C 语言编译程序
CFLAGS = -Wall -g   #传递给 CC 程序的标志
LDFLAGS = -L -lFOO  #传递给链接程序的标志 库文件链接
​
# 自定义变量,目标文件, 变量引用为$(变量)
TARGET = test           
SRC = test.c \
    ./testadd/add.c \
    ./testsub/sub.c
​
#头文件路径
INC = -I ./ -I ./testadd -I ./testsub
​
​
# makefile规则,第一个目标文件为make默认的执行目标
all:test.c ./testadd/add.c ./testsub/sub.c
    gcc -I ./ -I ./testadd -I ./testsub -o test test.c ./testadd/add.c ./testsub/sub.c
    
exe1:$(SRC)         #输入make exe1执行特定的目标规则
    $(CC) $(LDFLAGS) $(INC) -o $(TARGET) $(SRC)
    
$(TARGET):$(SRC)
    $(CC) $(LDFLAGS) $(INC) -o $@ $^        # $@目标文件,$^包含所有的依赖文件
​
.PHONY:clean        #将目标文件clean设置为伪目标,该目标的规则被执行后不产生文件
clean:              #makefile规则
    rm -f $(TARGET) *.o #*.o是指任意.o文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

贴地气的安卓UI自动化工具4399AT全面更新了~

4399AT是 一款兼容多设备运行并实现全自动化的测试的安卓UI工具&#xff0c;全自动化测试是指从apk的安装到按钮点击&#xff0c;密码输入到安装完成&#xff0c;不需要人工介入&#xff0c;兼容android5.0-12.0系统大部分品牌&#xff0c;至于开始测试&#xff0c;启动apk后&a…

(十)笔记.net学习Lambda和Linq表达式

1.lambda表达式的演变 Lambda表达式的本质是“匿名方法”&#xff1a; C#的Lambda 表达式都使用 Lambda 运算符 >&#xff0c;该运算符读为“goes to”。语法如下&#xff1a; (object argOne, object argTwo) > {; /*Your statement goes here*/} 函数体多于一条语句…

一次Actuator未授权访问利用

目录 介绍 复现 Actuator目录下可能利用泄漏信息的路径 利用 思考 处理意见 介绍 事先得到同意对朋友公司的网站进行了扫描&#xff0c;扫出了一个Actuator未授权&#xff0c;于是开始复现并记录一下&#xff0c;最后获取了redis的密码 复现 这里是请求包 响应包成功返回…

qt 虚拟键盘中的几个瑕疵

最近使用了下面楼主的虚拟键盘&#xff0c;总体还是挺好用的&#xff0c;只是有几个地方&#xff0c;需要完善下。 基于Qt的可用于嵌入式的虚拟键盘_偷段代码的博客-CSDN博客_qt 嵌入式虚拟键盘这几天完成了一个基于Qt的虚拟键盘的编写&#xff0c;记录一下过程与感受&#xf…

Python操作Numpy模块库

14天学习训练营导师课程&#xff1a; 杨鑫《Python 自学编程基础》 杨鑫《 Python 网络爬虫基础》 杨鑫《 Scrapy 爬虫框架实战和项目管理》 Python操作Numpy模块库 文章目录Python操作Numpy模块库1.Numpy介绍2.Numpy安装3.Numpy模块练习3.1 创建数组3.2 获取数组3.3 切割数组…

二叉树路径问题+递归+有关题目

一、分类 1、自顶向下 顾名思义&#xff0c;就是从某一个节点(不一定是根节点)&#xff0c;从上向下寻找路径&#xff0c;到某一个节点(不一定是叶节点)结束&#xff0c;具体题目如下&#xff1a;而继续细分的话还可以分成一般路径与给定和的路径 二叉树的所有路径面试题 04…

Qt 利用UDP进行通信

一、UDP的特点 UDP&#xff08;用户数据报协议&#xff09;是一种简单轻量级、不可靠、面向数据报&#xff0c;无连接的传输层协议。而TCP/IP协议却是有连接的 二、UDP适合应用的几种情况 1、网络数据大多为短消息 2、拥有大量客户端 3、对数据安全性无特殊要求 4、网络负…

pmap gdb 分析堆外内存泄露情况

一、查看内存分部 pmap -x 8 | sort -k3 -n -r | more ---- 8 是 PID 最大的肯定是堆内存。 其他的就需要看情况来分析了。 二、cat /proc/8/smaps | grep 7fad64000000 -- 8 是 PID , 地址的前4个0需要去掉。查到起止内存地址。 7fad64000000-7fad68000000 r…

Bioinformatics2019 | FP2VEC+:基于新分子特征的分子性质预测

论文标题&#xff1a;FP2VEC&#xff1a;a new molecular featurizer for learning molecular properties 代码&#xff1a; GitHub - wsjeon92/FP2VEC 预测化合物性质最成功的方法之一是定量结构-活性关系(QSAR)方法。 Mol2vec使用分子子结构表将分子结构表示为类似于分子指…

甘露糖-聚乙二醇-CY5 Cy5-PEG-mannose

甘露糖-聚乙二醇-CY5 Cy5-PEG-mannose 中文名称&#xff1a;甘露糖-菁染料CY5 英文名称&#xff1a;mannose-Cyanine5 别称&#xff1a;CY5标记甘露糖&#xff0c;CY5-甘露糖 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取…

设计模式之美——实战MVC的意义

对于一个工程师来说&#xff0c;如果要追求长远发展&#xff0c;你就不能一直只把自己放在执行者的角色&#xff0c;不能只是一个代码实现者&#xff0c;你还要有独立负责一个系统的能力&#xff0c;能端到端&#xff08;end to end&#xff09;开发一个完整的系统。这其中的工…

《机械工程基础》复习题

一、填空题&#xff1a; 1. 构件由于受力不同&#xff0c;会产生不同的变形。基本形式有以下五种&#xff1a;1. 弯曲 &#xff1b;2. 扭转 &#xff1b; 3. 剪切 &#xff1b;4. 轴向拉伸 &#xff1b;5. 轴向压缩 。 2. 在机器中&#xff0c;运动的基本单元称之为__机构_ ___…

ip-guard安全网关问题集锦一

1、忘记安全网关Web管理界面的登录密码如何处理&#xff1f; 重置安全网关Web管理界面的登录密码操作如下&#xff1a; 1、把网线连接电脑和网管的emp端口。 2、修改电脑的Ip为190.190.190.x&#xff0c;子网掩码&#xff1a;255.255.0.0。 3、电脑上访问http://190.190.190.1…

Django Web框架的使用

1.前言 Django是基于Python的重量级开源Web框架。Django拥有高度定制的ORM和大量的API&#xff0c;简单灵活的视图编写、优雅的url、适用于快速开发的模板以及强大的管理后台。 Django简介可以查看菜鸟教程 Django 简介 | 菜鸟教程 2.使用pip安装Django 当我们更换镜像源进…

Windows更新NVIDIA显卡驱动

笔记本显卡联想拯救者Y70001050Ti 1、首先进入GeForce官网&#xff0c;选择顶部的驱动程序。 2、拉到下面手动搜素驱动程序&#xff0c;有以下6个筛选条件。 3、我的显卡是GTX 1050Ti&#xff0c;所以选择的配置情况如下。这里注意下产品系列选择的一定要是带&#xff08;NoteB…

一款可以协助排查视频是否乱序的软件:BitRecoverFree JPEG Viewer

笔者在做某个嵌入式linux视频项目的过程中&#xff0c;遇到的需求如下&#xff1a;同事在解码进程中将h264解码为RGB数据&#xff0c;发送给Qt进程&#xff0c;我在Qt进程中通过RPC接收RGB图片数据&#xff08;至于为啥不是接收压缩后的h264数据&#xff0c;这是历史遗留问题&a…

虾皮、Lazada怎么选爆款?测评有哪些方法?

对于一个店铺来说&#xff0c;想要让自己店铺获得更多的流量推广&#xff0c;那么打造出爆款是非常重要的&#xff0c;虾皮、Lazada作为跨境平台也是同样如此&#xff0c;下面就来介绍虾皮、Lazada怎么去选爆款? 1、跟卖 以Shopee、Lazada平台选品&#xff0c;直接“抄”同行…

JavaScript开发工具WebStorm入门教程:开始运行WebStorm(一)

WebStorm是一个JavaScript开发工具&#xff0c;用于JavaScript及其相关技术编码&#xff0c;包括TypeScript、React、Vue、Angular、Node.js、HTML和样式表。就像IntelliJ IDEA和其他JetBrains ide一样&#xff0c;WebStorm让您的开发体验更愉快&#xff0c;自动化日常工作&…

SpringBoot集成Spring Data JPA项目实操

《从零打造项目》系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 SpringBoot集成MybatisPlus项目实操 SpringBoot集成Spring Data JPA项目实操 前言 该说的在《SpringBoot集成Mybatis项目实…

HikariCP源码阅读笔记

加入HikariCP的maven依赖 <dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>4.0.3</version> </dependency> <dependency><groupId>mysql</groupId><artifactId&g…