系统编程--makefile项目管理

这里写目录标题

  • 介绍
  • 语法结构
    • 总览
    • 基础规则
      • 简介
      • 最简单的makefile
      • 对于基础规则的理解和应用
      • 总结
    • makefile时尽量使用更独立的命令,减少文件之间的耦合度
      • 需求以及解决
      • 总结
    • 补充(关于makefile中脚本命令的编写顺序)
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录

介绍

makefile就是一个命令脚本文件,接下来我们介绍如何使用他

语法结构

总览

在这里插入图片描述
要注意,想要使用与makefile相配合的make命令的话,makefile文件必须命名为“makefile”或者“Makefile”

基础规则

简介

在这里插入图片描述

最简单的makefile

一个规则:目标:依赖
(tab缩进)命令
如下图所示,是一个最简单的Makefile脚本文件
在这里插入图片描述
目标:就是最后要生成的文件的文件名
依赖:就是生成可执行文件的源文件
下一行先起一个tab,之后输入正常情况下我们要在终端输入的命令

在这里插入图片描述

对于基础规则的理解和应用

在这里插入图片描述
假如我们要运行如上所示命令,我们可以将其写入脚本文件makefile。如下图:
在这里插入图片描述
首先对于第一个脚本,目标是hello可执行文件,hello.o是依赖文件
但是目前makefile文件所在目录内没有hello.o文件,所以,我们可以再写一个脚本,用来生成hello.o
在这里插入图片描述
如上图所示,我们有了makefile之后,直接make命令,就可以执行makefile脚本文件里的脚本了,而当makefile中某个脚本所用的依赖在目录里没有时,make命令会接着在makefile文件内寻找有没有能生成所需要的依赖文件的脚本,如果有,则执行生成所需要的依赖文件之后,再去执行相应的脚本

总结

在这里插入图片描述

makefile时尽量使用更独立的命令,减少文件之间的耦合度

需求以及解决

在这里插入图片描述
在这里插入图片描述
假如我们按照如上所示命令,进行多个源文件的联合编译,从而生成可执行文件a.out
那么如果我们要修改其中一个源文件的代码,之后,想要生成新的可执行文件的话,就要再次make,这样,其他的不变的源文件又被编译了一次,比较浪费系统资源,所以,我们最好在写此类多文件联编的命令脚本时,要尽量减少各文件之间的耦合度,但是因为是多文件联合编译,我们也不能将他们完全隔离,我们可以在链接阶段将他们进行联编,其他阶段,各自生成各自的文件,如下图:
在这里插入图片描述
在这里插入图片描述
这个makefile在终端的命令如上图所示,这样,如果其中一个文件被改变了,那么也不会影响到其他文件
先对各个文件独立编译生成各自的可链接文件.o后缀文件,之后再将他们的可链接文件进行联编,生成可执行文件
最终效果如下图所示:
在这里插入图片描述
可以看到,当我们对div函数进行了修改之后,再次make,他就只会去再次编译div函数,其他的不运行,这样,系统资源就被高效利用了

总结

在这里插入图片描述
这就体现了第二条规则,如果依赖被更新了,那么make会先去更新依赖,再去生成目标
(本质上,make在执行时,会检查每个依赖文件的修改时间,如果我们在生成了可执行文件之后,又去修改了某个源文件,那么该源文件的修改时间就会比之前生成的可执行文件的时间要晚,这在make看来是不被允许的,所以如果我们修改了源文件再去make,make检查到这里发现问题之后,会只执行那个被修改了的依赖文件的脚本,然后再去生成可执行文件)

补充(关于makefile中脚本命令的编写顺序)

在这里插入图片描述
假如我们把a.out的脚本放在文本的最下面,那么make在执行完第一个脚本之后,他就会认为自己的使命完成了,就不会继续向下执行了
也就是他会把第一个脚本当成自己的终极目标,所以,我们前面一直把a.out目标脚本放在第一个,但是也有解决办法:
在这里插入图片描述
我们可以加上一个关键字ALL:,规定好终极目标文件为a.out,那么接下来在makefile文件中的顺序就无所谓了

一级目录

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据科学中的Python:NumPy和Pandas入门指南【第121篇—NumPy和Pandas】

数据科学中的Python:NumPy和Pandas入门指南 数据科学是当今数字时代中的一个重要领域,而Python是数据科学家们最喜爱的编程语言之一。在这篇博客中,我们将介绍Python中两个强大的库——NumPy和Pandas,它们在数据处理和分析中发挥…

java算法第十八天 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

110.平衡二叉树 leetcode链接 思路: 使用后序遍历分别求左右子树的高度,若高度只差大于一,则返回-1,否则返回当前节点的最大高度。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* Tree…

爬虫(五)

1. 前端JS相关 三元运算 v1 条件 ? 值A : 值B; # 如果条件成立v1值A,不成立v1等于值Bres 1 1 ? 99 : 88 # res99特殊的逻辑运算 v1 11 || 22 # Ture v2 9 || 14 # 9 v3 0 || 15 # 15 v3 0 || 15 || "zhangfei" # 15赋值和…

x86 Ubuntu上编译eudev给龙芯loongarch64架构主机使用

1、下载eudev库eudev-master.zip,链接:eudev库官方地址 2、下载龙芯的交叉编译工具:loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.2.tar.xz,链接:龙芯交叉编译官方地址 3、交叉编译器环境搭建 (1)、…

latex绘图中\begin{figure}[htbp]中的htbp什么意思

在LaTeX中,\begin{figure}[htbp] 用来开始一个图形环境,其中 [htbp] 是一个位置参数,用来指导LaTeX如何放置这个图形。 具体来说,[htbp] 中的每个字母代表一个放置选项: h:代表“here”,意味着…

【LeetCode: 299. 猜数字游戏 - 模拟 + 计数】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

springcloud第3季 consul服务发现注册,配置中心2

一 consul的作用 1.1 为何使用注册中心 为何要用注册中心? 1.A服务调用B服务,使用ip和端口,如果B服务的ip或者端口发生变化,服务A需要进行改动; 2.如果在分布式集群中,部署多个服务B,多个服…

Linux(Ubuntu)中安装vscode

①首先去vscode的官网下载.deb文件 网址:https://code.visualstudio.com/docs/?dvlinuxarm64_deb 注:如果linux端无法打开网页下载文件,可以在Windows端下载好用WinSCP传输到Linux。下载前注意下你的系统架构是arm还是amd,系统…

常用的加密算法

AES 高级加密标准(AES, Advanced Encryption Standard)是当今世界范围内应用最广泛的对称加密算法之一。在微信小程序加密传输等场景中,AES算法发挥着至关重要的作用。对称加密算法的特点在于加密和解密过程使用相同的密钥。具体来说&#x…

【MybatisPlus】BaseMapper详解,举例说明

一、BaseMapper 简介 MyBatis-Plus 的核心类 BaseMapper 主要是用于提供基本的 CRUD(创建、读取、更新、删除)操作的接口定义。它是 MyBatis-Plus 框架中的一个重要组成部分,可以大大简化基于 MyBatis 的数据访问层代码的编写。 BaseMapper…

设计模式—桥接模式

定义: 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。 本章代码:小麻雀icknn/设计模式练习 - Gitee.com 结构: 抽象化(Abstraction)角色&#xff1a…

MMCV报错

文章目录 mmcv1.x版本FAQ文档open-mmlab卸载环境中的mmcvImportError: cannot import name Config from mmcv (unknown location)problem description解决 ImportError: cannot import name mkdir_or_exist from mmcv.utils (unknown location)解决 AttributeError: module mmc…

如何通过隐藏服务器真实IP来防御DDOS攻击

我们知道,服务器对外提供服务,基本上都是放置在公网上的。所以说服务器放置在公网上会面临很多攻击,如果不做好必要的防护措施,服务器被人攻击只是时间上的问题。 而我们面临的众多攻击中,DDoS攻击是最常见同时也是影响…

企业AI转型之路:策略与实践

目录 前言1 试点项目:积累AI经验1.1 选择有实际价值的项目1.2 创新氛围的激发1.3 员工对新技术的接受度提升 2 建立高效的内部AI团队2.1 团队独立性与高层直报2.2 初期资金支持与资源整合 3 提供全面的AI培训计划3.1 针对不同层次的培训3.2 多样化培训形式3.3 内部人…

【蓝桥·算法双周赛】第七场分级赛——小白入门赛

2.霓虹【算法赛】 - 蓝桥云课 (lanqiao.cn) st数组用来存第i个位置&#xff0c;这个字母有没有编号j #include<bits/stdc.h> const int N1e610; using lllong long; std::map<std::string,std::string> mp;std::string a,aa; int st[N][10];// int stt[N][10];//对…

【Greenhills】MULTIIDE集成第三方的编辑器进行源文件编辑工作

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 在使用GHS进行工作的时候&#xff0c;可以集成第三方的编辑器进行源文件编辑工作 2、 问题场景 用于解决在GHS中进行项目开发时&#xff0c;对于GHS的编辑器使用不习惯&#xff0c;想要切换到其他第三方的编辑…

遗传算法(GA)求解基于栅格地图的机器人最优路径规划,可以自行修改地图(提供MATLAB代码)

通过栅格法建立栅格地图作为机器人路径规划的工作环境,采用遗传算法作为机器人路径搜索的规则.将所有机器人放置于初始位置.经过NC次无碰撞迭代运动找到最优路径.到达目标位置.为防止机器人在路径搜索过程中没有达到最大迭代次数时路径大小已不发生变化而陷入局部最优。 一、部…

CentOS系统上安装Redis操作教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

【C++ vector 类】

1. 标准库中的vector类 vector 类 的介绍&#xff1a; 注意&#xff1a; 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是…

第一代高通S7和S7 Pro音频平台:超旗舰性能,全面革新音频体验

以下文章来源于高通中国 如今&#xff0c;音频内容与形式日渐丰富&#xff0c;可满足人们放松心情、提升自我、获取资讯等需求。得益于手机、手表、耳机、车载音箱等智能设备的广泛应用&#xff0c;音频内容可以更快速触达用户。从《音频产品使用现状调研报告2023》中发现&…