Linux笔记--make

        使用上一节的 main.c、add.c、sub.c文件进行编译,编译的过程有很多步骤,如果要重新编译,还需要再重来一遍,能不能一步完成这些步骤?将这些步骤写到makefile文件中,通过make工具进行编译

        一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile 就像一个Shell脚本一样,也可以执行操作系统的命令

一、介绍

1.概述

        Linux环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是Unix程序员。在Linux (unix)环境下使用GNU的make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投入一些时间去完成一个或者多个称之为Makefile 文件的编写。

        所要完成的 Makefile文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的 Makefile。编译整个工程你所要做的事就是在shell提示符下输入make命令。整个工程完全自动编译,极大提高了效率。

        make是一个命令工具,它解释Makefile 中的指令。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile有自己的书写格式、关键字、函数。像C语言有自己的格式、关键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile在绝大多数的IDE 开发环境中都在使用,已经成为一种工程的编译方法。

2.功能

        Make 工具最主要也是最基本的功能就是通过 makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile文件是许多编译器--包括Windows NT下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改makefile文件而已。

        在UNIX系统中,习惯使用Makefile作为makefile文件。如果要使用其他文件作为makefile,则可利用类似下面的make 命令选项指定makefile文件((通过参数-f指定我们的Makefile文件):

假设我们写的makefile文件名字叫做lib.mk

make -f lib.mk

二、书写规则

  • 一个基本规则:
目标:依赖条件
(一个tab缩进))命令
  • 两个常用函数:
  • wildcard 参数:按给定参数匹配文件名。例如: src = $(wildcard *.c),匹配当前目录下所有.c文件,将文件名组成列表赋值给src
  • patsubst参数1,参数2,参数3∶将参数3中,模式字符串替换,包含参数1的部分,替换为参数2。例如:obj = $(patsubst %.c,%.o,$(src)),当前目录所有.c文件替换成.o文件赋值给obj
  • 三个自动变量:
  • $@:在规则的命令中,表示规则中的目标
  • $^:在规则的命令中,表示所有依赖条件
  • $<:在规则的命令中,第一个依赖条件(如果将该变量应用在模式规则中它可将依赖条件列表中的依赖依次取出,套用模式规则)

三、基本规则

        规则包含两个部分,一个是依赖关系,一个是生成目标的方法(就是命令)。

        在Makefile 中,规则的顺序是很重要的,因为,Makefile 中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make 知道你的最终目标是什么。一般来说,定义在Makefile 中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make 所完成的也就是这个目标,也可以通过ALL指定我们的最终目标。

  • 常用规则:
targets :prerequisites
(tab) command

以gcc hello.c -o hello 举例:

hello: hello.c
gcc hello.c -o hello

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

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

相关文章

java 获取项目内的资源/配置文件

【getResourceAsStream】是java中用于获取项目内资源的常用方法&#xff0c;能够返回一个数据流&#xff0c;从而允许我们读取指定路径下的资源文件。这个方法可以用来读取各种类型的资源文件&#xff0c;包括但不限于文本文件、图像文件、配置文件等。 要使用getResourceAsStr…

高端相亲婚恋平台有哪些?分享五款高端靠谱相亲交友软件

如今市场上的相亲软件越来越多&#xff0c;但很少有人能找到自己心仪的相亲软件。在选择相亲软件时&#xff0c;大家最看重的就是安全性和真实性&#xff0c;因此我想向大家分享几款我用过且觉得可靠的高端相亲软件&#xff0c;希望能得到你们的认可。 1、丛丛 这是我用的最久的…

【[STM32]标准库-自定义BootLoader】

[STM32]标准库-自定义BootLoader BootloaderBootloader的实现BOOTloader工程APP工程 Bootloader bootloader其实就是一段启动程序&#xff0c;它在芯片启动的时候最先被执行&#xff0c;可以用来做一些硬件的初始化或者用作固件热更新&#xff0c;当初始化完成之后跳转到对应的…

LeetCode 热题 100 | 图论(二)

目录 1 基础知识 1.1 什么是拓扑排序 1.2 如何进行拓扑排序 1.3 拓扑排序举例 2 207. 课程表 3 210. 课程表 II 菜鸟做题&#xff0c;语言是 C 1 基础知识 1.1 什么是拓扑排序 含义&#xff1a;根据节点之间的依赖关系来生成一个有序的序列。 应用&#xff1a…

12:Logstash|Web日志实时分析

Logstash|Web日志实时分析 logstashlogstash工作结构安装Logstash编写logstash配置文件步骤一:codec类插件插件帮助手册Logstash input插件步骤一:file模块插件filter grok插件Web日志实时分析部署beats与filebeat步骤一:filter grok模块插件logstash 一个数据采集、加工处…

Ubuntu22.04系统 安装cAdvisor提示找不到 CPU 的挂载点错误解决办法。

如果我们在安装cAdvisor时容器启动不起来 查看日志如下图所示 1、查看cgroup文件系统是v2 还是 v1 mount | grep cgroup 如图所示我的是v2 &#xff0c; cAdvisor 目前的最新版本&#xff08;v0.39.0&#xff09;仍然只支持 cgroup v1&#xff0c;不支持 cgroup v2。因此&#…

闫震海:腾讯音乐空间音频技术的发展和应用 | 演讲嘉宾公布

一、3D 音频 3D 音频分论坛将于3月27日同期举办&#xff01; 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验&#xff0c;跨越时空的限制&#xff0c;探索未知的世界。同时&#xff0c;提供更加丰富、立体的情感表达和交流方式&#xff0c;让人类能够更加深入地理解彼此&…

做抖店月入百万还是会亏损?珠珠来告诉你,做抖店水到底有多深?

我是电商珠珠 抖店的热度一直只高不低&#xff0c;所以很多想要做的新手不知道抖店水的深浅&#xff0c;就一股脑的去做了。结果又是被扣保证金&#xff0c;又是被判定无货源违规的&#xff0c;最后灰头土脸的关了店。那些说做了十万十几万的&#xff0c;几百万的难道都是假的…

在三个el-form-item中的el-radio的值中取一个发送给后端怎么获取

问: 请问,这段代码怎么获取:无策略,策略1,策略2的值? 回答: 问: 三个里面只可以选中一个吗? 回答:

应对求职高峰:金三银四必备问答与大厂模板,成功职场攻略!

三四月是求职的黄金季节&#xff0c;很多设计师会选择在这个时候准备作品集。一个视觉精美、有条不紊的作品集&#xff0c;无疑是走向大厂的敲门砖。但是我问了一圈优秀社区的朋友&#xff0c;发现大家或多或少都遇到过问题。今天我整理了群里的高频问题&#xff0c;附上了解决…

[GXYCTF2019]BabyUpload1 -- 题目分析与详解

目录 一、题目分析 1、判断题目类型&#xff1a; 2、上传不同类型的文件进行测试&#xff1a; 二、题目详解 1、写出.htaccess文件&#xff1a; 2、.htaccess 文件配合 .jpg 上传&#xff1a; 3、利用 中国蚁剑/中国菜刀 获取flag&#xff1a; 一、题目分析 1、判断题目…

信奥一本通:1082:求小数的某一位

分数转换为小数就是分子除分母&#xff0c;但是他要求指定的n项小数&#xff0c;n大于1小于10000&#xff0c;如果是10000的话就太大了&#xff0c;用传统的方式无法找出指定的位数。 方式就是&#xff1a;例如求2分之1&#xff0c;我们先用除法把具体的值求出来&#xff0c;然…

图机器学习(1)--导论

0 CS224W概况 斯坦福大学CS224W课程&#xff1a;http://cs224w.stanford.edu/ 图机器学习的库&#xff1a; 为什么是图&#xff1f;图是描述和分析具有关系/交互的实体的通用语言。 1 图数据举例 复杂域具有丰富的关系结构&#xff0c;可以表示为关系图。 通过显式地建模关…

【论文阅读】Generative Pretraining from Pixels

Generative Pretraining From Pixels 引用&#xff1a; Chen M, Radford A, Child R, et al. Generative pretraining from pixels[C]//International conference on machine learning. PMLR, 2020: 1691-1703. 论文链接&#xff1a; http://proceedings.mlr.press/v119/chen…

LeetCode --- 三数之和

题目描述 三数之和 代码解析 暴力 在做这一道题的时候&#xff0c;脑海里先想出来的是暴力方法&#xff0c;一次排序&#xff0c;将这个数组变为有序的&#xff0c;再通过三次for循环来寻找满足条件的数字&#xff0c;然后将符合条件的数组与之前符合条件的数组进行一一对比…

2024.3.6补题

1.关鸡 对于这一道题&#xff0c;我们先按照题意进行分析&#xff1a;首先鸡自己的初始位置&#xff0c;如果着火点在鸡一开始的左右下各有一个那么就可以达到题目效果&#xff0c;也就是说不需要添加着火点&#xff0c;同时最多需要添加的着火点其实也就是它初始位置身边所有的…

Optional 详解

Optional 详解 1、Optional 介绍2、创建 Optional 对象3、Optional 常用方法1. 判断值是否存在 — isPresent()2. 非空表达式 — ifPresent()3. 设置(获取)默认值 — orElse()、orElseGet()4. 获取值 — get()5. 过滤值 — filter()6. 转换值 — map() 作为一名 Java 程序员&am…

电子电器架构刷写策略 —— 队列刷写

电子电器架构刷写策略 —— 队列刷写 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

EasyX的学习2

消息处理——漂亮的按钮(鼠标) 用到的函数 1.消息结构体变量类型&#xff1a;使用ExMessage ExMessage msg{ 0 }; 定义一个变量名为msg的ExMessage结构体变量并初始化为0 2.获取消息函数&#xff1a;peekmessage函数 //获取消息 peekmessage(&msg, EX_MOUSE); 两个参…

【Linux】基本指令(中)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 目录 man指令 cp指令 mv指令 cat指令 more指令 less指令 head指令 …