【操作系统】Liunx项目自动化构建工具-make/Makefile

news2024/11/26 22:42:30

       

  5a2585dded9b416fb4ea58637b42ed39.png

  Yan-英杰的主页

悟已往之不谏 知来者之可追  

C++程序员,2024届电子信息研究生


目录

一、背景

二、Makefile

        实现

        Makefile依赖

        依赖关系

        makefile的工作原理

        项目清理

        补充:

        .PHONY是什么?

       Linux如何进行多行注释:

        说明:

三、Linux小程序(进度条)

四、使用git命令行

五、git三板斧

        下载项目到本地

        三板斧第一招: git add

        三板斧第二招: git commit

        三板斧第三招:git push


一、背景

         会不会写makefifile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefifile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefifile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefifile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefifile都成为了一种在工程方面的编译方法。make是一条命令,makefifile是一个文件,两个搭配使用,完成项目自动化构建。

二、Makefile

        实现

         C代码
        
#include <stdio.h>
int main()
{
     printf("hello Makefile!\n");
     return 0;
}
        Makefifile文件 hello:hello.o gcc hello.o -o hello hello.o:hello.s gcc -c hello.s -o hello.o hello.s:hello.i gcc -S hello.i -o hello.s hello.i:hello.c gcc -E hello.c -o hello.i

        Makefile依赖

        
.PHONY:clean
clean:
 rm -f hello.i hello.s hello.o hello

        依赖关系

        上面的文件 hello ,它依赖 hell.o
        hello.o , 它依赖 hello.s
        hello.s , 它依赖 hello.i
        hello.i , 它依赖 hello.c

        makefile的工作原理

                ① make命令会在当前目录下找到名字叫 “Makfile”或“makefile”的文件——>②首先
找到,第一个目标文件,在上面的例子中,他会先找到hello这个文件,并把这个文件作为最
终文件——> ③ 如果hello文件不存在,或者是hello所依赖的hello.o这个文件的修改时间要比
hello.o这个文件行,那么他就会执行后面所定义的命令来生成hello这个文件——> ④  如果
hello所依赖hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如
果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)——> ⑤ 当然,
你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明
make的终极任务,也就是执行文件hello了。 ——> ⑥ 这就是整个make的依赖性,make会
一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。 ——> ⑦ 在找寻的过
程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而
对于所定义的命令的错误,或是编译不成功,make根本不理。 ——> ⑧  make只管文件的依
赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在

        

        项目清理

        

        像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会
被自动执行, 不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有
的目标文件,以便重编译。但是一般我们这种clean的目标文件,我们将它设置为伪目标,用
.PHONY 修饰,伪目标的特性是,总是被执行的。可以将我们的 hello 目标文件声明成伪目
标,测试一下

        补充:

        .PHONY是什么?

         .PHONY是一个伪目标,
        可以防止在Makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突,另一种是提交执行makefile时的效率。

       Linux如何进行多行注释:

        1.ESC退出到命令模式

        2.ctrl+v 切换到可视化模式

        3.HJKL挪动光标位置

        4.shift+i输入//

        5.再按ESC即可,进行多行注释

        说明:

        
        (1)伪目标意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件或东西,而是单纯为了执行这个目标下面的命令。
        (2)伪目标一般都没有依赖,因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖,因为不加依赖意思就是无条件执行。
        (3)伪目标可以直接写,不影响使用;但是有时候为了明确声明这个目标是伪目标会在伪目标的前面用.PHONY来明确声明它是伪目标
        例如:
        
        
.PHONY clean

clean:
        rm -rf *.o 

       使make命令会自动绕过隐含规则搜索过程,也就是说执行命令make clean会自动忽略名

为"clean"文件的存在,因此声明.PHONY配置项会改善性能,并且不需要担心实际同名文件存在

与否。

        

三、Linux小程序(进度条)

       依赖关系:Makefile

        

processbar: main.c processBar.c
    gcc -o $@ $^
.PHONY:clean
clean:
    rm -f processbar

        processBar.h

        

#pragma once
#include<stdio.h>
#include<string.h>
#include<unistd.h>
extern void processbar();

        

        processBar.c

        

#include "processBar.h"
  
 void processbar()
 {
     int i = 0;
     char bar[102];
     memset(bar, 0 ,sizeof(bar));
     const char *lable="|/-\\";
    
    while(i <= 100)
    {
      printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
      fflush(stdout);
      bar[i++] = '#';
      usleep(10000);
    }
    
    printf("\n");
    
}   

四、使用git命令行

        背景:

        Git属于分散型版本管理系统,是为版本管理而设计的软件。

        Linux的创始人Linus Torvalds在2005年开发了Git的原型程序。当时,由于在Linux内核开发中使用的既有版本管理系统的开发方许可证发生了变更,为了更换新的版本管理系统,Torvalds开发了Git。

        Linux内核的更新速度在全世界也算首屈一指。因此,势必需要一个功能强、性能高的版本管理系统来提高开发速度。

        在当时的开源环境下,虽然已经有数款版本管理软件被开发出来,但功能和性能都差强人意。加之Git是由Linus Torvalds亲自着手开发的,可以说在功能与性能方面无可挑剔。程序员们愿意接受Git,很大程度上取决于这个背景。

        
        

五、git三板斧

        注:在做这些操作之前要先有个gitee或github的账号
        

        下载项目到本地

        创建好一个放置代码的目录.
        这里的 url 就是刚刚建立好的 项目 的链接 .

        三板斧第一招: git add

        

  git clone https://www.xxxx.com/xxxxxx
        将代码放到刚才下载好的目录中
      
        将需要用 git 管理的文件告知 git

        三板斧第二招: git commit

        提交改动到本地
        最后的 "." 表示当前目录
        提交的时候应该注明提交日志, 描述改动的详细内容 .
        报错:

        

        当遇到commit提交时,git命令无法识别,提交人的身份应该如何解决这种问题 

        

//修改默认邮箱和账户

git config --global user.email "xxx@qq.com"

git config --global user.name "Yan-英杰"

        三板斧第三招:git push

                同步到远端服务器上

git push
        同步到远端服务器上
        需要填入用户名密码. 同步成功后 , 刷新 Github 页面就能看到代码改动了

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

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

相关文章

app 元素定位失败了,怎么办?一看我的做法,惊呆了!

粉丝们在日常的android app自动化测试工作当中&#xff0c;元素定位时会遇到以下类似的报错&#xff1a; 然后来问博主&#xff0c;这是啥情况&#xff1f; 我一般都会送上亲切的关怀&#xff1a; 1&#xff09;adb能识别到设备吗&#xff1f; 2&#xff09;设备有被其它的程…

VUE+element Input框 实现输入内容可自适应文本高度,换行(空格换行,enter发送)阻止文本域的回车事件

需求 输入框实现输入内容自适应高度 以及可以换行 使用官方文档提供的属性 代码 <el-input clearable autosize type"textarea" :placeholder"$t(navbar.pleaseInput)"v-model"inputText" change"inputChange" keyup.enter.na…

数据分析之Matplotlib

文章目录 1. 认识数据可视化和Matplotlib安装2. 类型目录3. 图标名称title4. 处理图形中的中文问题5. 设置坐标轴名称&#xff0c;字体大小&#xff0c;线条粗细6. 绘制多个线条和zorder叠加顺序7. 设置x轴刻度xticks和y轴刻度yticks8. 显示图表show9. 设置图例legend10. 显示线…

Ceph简介及部署

Ceph Ceph一、存储基础1、单机存储设备2、Ceph 简介3、Ceph 优势5、Ceph 架构6、Ceph 核心组件7、OSD 存储后端8、Ceph 数据的存储过程9、Ceph 版本发行生命周期10、Ceph 集群部署 二、部署ceph-deploy Ceph 集群前环境配置1、关闭 selinux 与防火墙2、根据规划设置主机名3、配…

全网火爆,pytest自动化测试框架从0-1精通实战,你的进阶之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、运行方式 命令…

(68Ga)Nota-prgd2,1345968-02-6,通过镓标记的NOTA衍生物

文章编辑来自于&#xff1a;陕西新研博美生物科技有限公司MISS.wu​ (68Ga)Nota-prgd2| CAS&#xff1a;1345968-02-6| 纯度&#xff1a;95% PART1-----(68Ga)Nota-prgd2结构式 PART2-----试剂参数信息 CAS&#xff1a;1345968-02-6 外观&#xff08;Appearance&#xff09;…

网络安全(黑客)学习笔记

0基础学网安或者提升巩固网安技术的小伙伴有福了&#xff01; 本篇整合了网络安全全知识点&#xff0c;零基础也适用&#xff01; 本篇涵盖内容及其全面&#xff0c;强烈推荐收藏&#xff01; 一、学习网络安全会遇到什么问题呢&#xff1f; 1、学习基础内容多时间长 2、难…

周报(1)

文章预览&#xff1a; 本周内容&#xff1a;Python语言的学习和pytorch安装配置1 Python基础知识1.1 交互式解释器1.2 数和表达式1.3 变量1.4 获取用户输入1.5 函数1.6 模块1.7 字符串1.7.1 单引号字符串以及对引号转义1.7.2 拼接字符串1.7.3 字符串表示str 和repr Pytorch 的安…

vue 限制表情输入

在main.js中加入下列代码 import emoji from ./util/emojiVue.directive(emoji,emoji) 在util文件夹中加入emoji.js 下列代码 const findEle (parent, type) > { return parent.tagName.toLowerCase() type ? parent : parent.querySelector(type)}const emoji {bi…

vite vue3进行多环境打包配置

需求&#xff1a; 对此vite创建的vu3项目进行构建&#xff0c;项目分为四个环境&#xff1a;本地、测试、预发、生产 1.在项目根目录创建四个文件夹 .env.development .env.test .env.pre .env.production 2.配置不同环境的 地址和打包文件名 具体例子如下&#xff1a; …

手机验证码登录 -- 手把手教你做ssm+springboot入门后端项目黑马程序员瑞吉外卖(七)

文章目录 前言一、短信发送1. 短信服务介绍2. 阿里云短信服务3. 代码开发 二、手机验证码登录1. 需求分析2. 数据模型3. 代码开发4. 功能测试 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果…

项目名称:网络聊天室

目录 一&#xff0c;简述 二&#xff0c;项目要求 三&#xff0c;程序流程图 服务器端&#xff1a; 客户端&#xff1a; 四&#xff0c;相关知识点 通信流程&#xff1a; 函数接口&#xff1a; 五&#xff0c;代码实现 客户端&#xff1a; 服务器&#xff1a; 主程序…

Android性能优化——启动优化

App 的启动速度是用户的第一体验&#xff0c;互联网中有一个八秒定律&#xff0c;如果用户等待八秒App 还没打开&#xff0c;70%的用户都会停止等待 一、启动分类 官方 App startup time 冷启动 耗时最多&#xff0c;衡量标准 热启动 最快。 后台&#xff5e;前台 温启动…

Git 新建本地仓库,推送到远程仓库

1、在项目的根目录右键 Git Bash Here 打开目录下的 git 命令 2、输入 git init 回车&#xff0c;初始化项目&#xff0c;把这个项目变成一个Git可以管理的仓库 项目根目录出现 .git 隐藏文件夹。这个目录是Git来跟踪管理版本库的&#xff0c;没事千万不要手动修改这个目录里面…

MateBook E Go Wi-Fi性能版(GK-W76)工厂模式win11原厂系统,含F10智能恢复功能

HUAWEI华为MateBook E平板笔记本电脑(GK-W76)原装出厂Windows11系统包&#xff0c;带F10一键智能还原 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、华为电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;zip 文件大小&#xff1a;1…

Linux基础(三)端口、进程及主机状态管理、环境变量、文件管理

目录 端口 nmap netstat 进程管理 查看进程 关闭进程 主机状态监控 系统资源top命令 磁盘信息监控 网络状态监控 环境变量 $符号 自己设置环境变量 自定义环境变量PATH Linux的文件和下载 压缩和解压 tar命令 zip和unzip命令 端口 每个电脑有一个ip地址&#xff…

自动化测试(一):网页结构分析与Google翻译2023.7.18爬虫实例

目录 1. 网页分析1.1 静态网页1.2 静态网页的爬取案例1.3 动态网页1.4 Google翻译2023.7.18爬虫实例1.4.1 基于网页分析的Google翻译2023.7.18爬虫实例1.4.2 基于Selenium的Google翻译2023.7.18爬虫实例 1. 网页分析 网页分析即通过检查元素&#xff0c;确定想提取的内容的区域…

pyright 的配置方法

珍惜发量,拥抱python&#x1f602; 可以很快的构建一个平台管理程序,嵌入式设备,芯片厂商&#xff0c;都是python 的示例代码了 Lua 真的很棒&#xff0c;值得嵌入式领域的推广 实时性要求不高的&#xff0c;嵌入式设备,可以考虑lua python PC 的程序 ,python/Rust/C &#xf…

波奇学Linux:冯诺依曼和进程

现代计算机大多是冯诺依曼体系结构&#xff0c;这是一种硬件结构&#xff0c;规定了设备组成和设备类型。 存储器:内存&#xff0c;磁盘/U盘是外存是输入输出设备。 输入设备&#xff1a;键盘/磁盘/摄像头/话筒/网卡 输出设备&#xff1a;显示器&#xff0c;播放器硬件&#…

Spring6 初始

Spring6 初始 文章目录 Spring6 初始每博一文案:1. 初始 Spring61.1 OCP开闭原则1.2 依赖倒置原则DIP1.3 控制反转IoC 2. Spring 初始2.1 Spring特点2.2 Spring6 的下载&#xff1a;2.3 Spring的jar文件 3. 第一个Spring 程序的编写4. 第一个Spring程序详细剖析4.1 bean标签的i…