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

Linux入门篇学习——Linux 编写第一个自己的命令,make 工具和 makefile 文件

目录

一、Linux 编写第一个自己的命令

1.命令的概念

2.定义一个自己的命令

二、make 工具和 makefile 文件

1.使用 make 工具

2.makefile文件


一、Linux 编写第一个自己的命令

1.命令的概念

        命令就是可执行程序。

        比如说我们输入 ls -al ,ls 就是可执行程序的的名字。-al 就是要传递进去的参数。

        ps 命令:

        功能:显示进程的动态。

        输入 “ps” 命令

        当 shell 接收到我们的命令以后,会根据我们输入的字符到环境变量和默认路径中去找,环境变量上一 章提过,可以通过打印查看都有哪些环境变量,然后它会去寻找有没有名字和我们输入命令一样的程序。

2.定义一个自己的命令

        进入/home/topeet/test 目录,把原来的都删掉,作者这里先创建一个 .c 文件,使用“touch commond.c ”命令,使用命令“vi commond.c ”打开文件,然后输入以下内容:

#include <stdio.h>
int main(void)
{printf(“This is my commod!\n”);return 0;
}

        接着使用命令“gcc commond.c -o commond ”编译 commond.c 文件,然后运行一下,使用“./commond ”命 令 , 虽然 我 们 现 在 可以 执 行 这 个 可 执行 文 件 , 但 是 现在 我 们 现 在 的这 个 可 执 行 程 序只 能 在/home/topeet/test 这个路径下输入,而且我们还要加上当前目录,如果我切换到上一级目录,就不能用“ ./commond ”来运行 commond ,因为当前目录下没有 commond 这个文件,我们直接输入命令“commond ”也不行,会提示错误。

        我们上一章学了环境变量,环境变量里边 PATH 变量决定了我们的程序或者是命令都要去哪些路径下找,那我们可以把存放可执行程序的路径加到环境变量里面,那么在任意路径下输入 commond 这个命令,它就会自动找到 commond 这个可执行文件来帮助我们执行。

        我们前面学到的根目录下的 bin 文件是专门存放可执行文件的,我们直接把生成的这个 commond 可执行性文件拷贝到根目录下 bin 文件夹也是可以的。即用 cp 命令拷贝到 bin 文件夹,作者输入 “cpcommond /bin/ ”,提示没有权限,加上 sudo ,然后直接输入“commond ”,可以看到打印 This is my commond! ,然后再返回上一级,这个路径下是没有 commond 这个程序的,我再输入“ commond ”,也是可以执行成功的,所以用这个方法是可以的。

        我们不使用这个方法,我们把存放 commond 这个可执行文件的路径加到 PATH 这个变量里面去,先把刚才我们拷贝到 bin 文件夹下的可执行文件把它删掉。

        我们直接使用命令来添加,“export PATH=/home/topeet/test/:$PATH ”,添加环境变量的办法上一章已经讲到了,使用命令“echo $PATH ”来检查是否添加成功,现在就已经成功添加进去了,如下图所示。我们输入“ commond ”这个命令来测试,也能执行成功,然后我在换另一个目录,作者把它切换到 Videos 这个文件夹里面去,输入“ cd Videos”,然后在输入 commond ,同样也能执行成功,同时也验证了之前的说法,命令就是可执行文件。

        本章是把我们之前学到的进行一个串通。比如说环境变量的修改, gcc 的编译。同时我们也知道了平常使用的命令就是一个可执行程序,而且在键盘上输入了我们的命令之后,这个命令发给了 shell 。也就是如下图的这个 bash,是发送给它的,然后它会根据我们输入的这个字符串去环境变量里面去找,去看看有

没有和我们的名字一样的程序。

二、make 工具和 makefile 文件

        前面我们在编写 linux 上第一个程序 hello world 的时候是直接使用 gcc 命令的。我们编译一个程序是非常的简单的,直接输入 gcc 然后跟上程序的名称再跟上指定生成程序的名称,就可以很轻松的编译出 hello这个可执行文件了。但是如果我们以后工作的时候要编译一个工程,这个工程里面有很多的源文件,这时候我们全部使用这个命令来编译那就非常的麻烦了,而且如果我们修改了一个源文件,那么我们使用命令来编译就要再次执行一遍这个过程,就会非常的耗时间。

        如果有小伙伴以前学习过单片机,大家可以类比下单片机开发软件 keil 里面的单独编译和全部编译。单独编译是很省时间的,全部编译就会非常的耗时间,我们使用命令来编译就相当于我们单片机软件中的全部编译。为了解决编译一个工程非常繁琐这个问题,前人就给我们发明了编译辅助工具 make 工具,它的编译思路是非常简单的,它会在编译之前先比较哪个文件的时间发生了改变,如果说这个文件它修改的时间要晚于编译生成的文件,那么它就会按照要求重新构建这些文件,而不是说再浪费时间重新构建其他的文件了。假如在单片机上用 keil 写了一个 c 文件,这个工程里边别的文件没有改,那么我们就不用点全部编译,只要编译一下我们修改过的文件就可以了。make 也是这样的,只不过它比较聪明,它不用再人为

的去判断了,在编译之前会自动帮我们判断。

1.使用 make 工具

        make 工具是编译辅助工具,用来解决使用命令编译工程非常繁琐的问题。

        调用这个命令工具:我们在 windows 上编程使用 ide ,我们有图形界面,有相应的按钮,比如说 build或者 run 来编译。其实 make 这个编译辅助工具使用也是非常简单的,我们在控制台上直接输入 make 命令,它就会自动调用 make 工具。

        我们来直接在这个目录下输入 make ,然后报错了,因为我没有告诉 make 这个工具它按照什么规则来编译我们的程序。如下图所示。

2.makefile文件

        Makefile 就是描述了整个工程编译连接等规则的文件。我们在终端输入完 make 命令之后,调用 make工具,make 就会在当前目录按照文件名就会找 makefile 文件,Makefile 的命名必须是 makefile 或 Makefile ,m 大写小写都是可以的。

       我们刚才输入命令报错的原因是因为在当前目录下是没有 makefile 这个文件的,作者这里新建一个Makefile 文件,然后在当前目录下输入 make 命令,我输入完 make 命令,它就会调用 make 工具,make工具就会在当前目录下找到 makefile 这个文件,这里又报错了,因为作者这里创建的 makefile 文件,他虽然找到了但是里面是空的,因为没有包含任何的规则。如下图所示。

        接下来先给大家写一个简单的来试一下,打开 makefile 文件,敲的时候一定要按 Tab 首行缩进,不能用空格,然后我们输入内容,保存退出,如下图所示。

        然后输入 make ,在当前这个目录下,成功的生成 hello 这个可执行文件,执行一下,可以看到成功输出了,到这里我们的编译流程就已经讲完了,我们也成功的利用 makefile 文件和 make 工具,把 hello.c 编译成了 hello 可执行文件。如下图所示。

        我们弄清楚了什么是 make 工具,怎么来调用 make 工具,makefile 又是什么,弄清楚了他们的关系后,后面我们再学习 makefile 语法和裸机编写 makefile 时,就非常的容易了。

http://www.lryc.cn/news/585785.html

相关文章:

  • C++编程基础
  • 大模型在卵巢癌预测及诊疗方案制定中的应用研究
  • Linux驱动基本概念(内核态、用户态、模块、加载、卸载、设备注册、字符设备)
  • Allegro 17.4操作记录
  • 【理念●体系】从零打造 Windows + WSL + Docker + Anaconda + PyCharm 的 AI 全链路开发体系
  • 数据库系统的基础知识(三)
  • uniapp---入门、基本配置了解
  • spring-ai RAG(Retrieval-Augmented Generation)
  • ESP32_启动日志分析
  • 力扣 hot100 Day41
  • RLHF:人类反馈强化学习 | 对齐AI与人类价值观的核心引擎
  • Linux711 Mysql
  • openpilot:为您的汽车插上智能驾驶的翅膀
  • 创意总监的动态视觉秘诀:用AE动态遮罩AI,轻松实现“人景分离”
  • 【每日刷题】加一
  • Java 中的锁分类
  • 【牛客刷题】吃糖果----糖果甜度问题(贪心策略详解)
  • 小车循迹功能的实现(第六天)
  • UML 与 SysML 图表对比全解析:软件工程 vs 系统工程建模语言
  • 持有对象-泛型和类型安全的容器
  • 线程通信V
  • 【Linux】系统引导修复
  • InnoDB 存储引擎的 架构
  • 渗透测试之木马后门实验
  • 世界现存燃油汽车品牌起源国别梳理
  • k8s新增jupyter服务
  • 中国国际会议会展中心模块化解决方案的技术经济分析报告
  • 【机器学习应用】基于集成学习的电力负荷预测系统实战案例
  • Linux设备树(dts/dtsi/dtb、设备树概念,设备树解析,驱动匹配)
  • kubernetes单机部署踩坑笔记