★ Linux ★ 基础开发工具的使用(上)

Ciallo~(∠・ω< )⌒☆ ~ 今天,我将和大家一起学习 linux 基础开发工具的使用~

52fc8aaee38e4b30b3305fc1ab3a99e5.jpeg

目录

壹  Linux编辑器 - vim使用

1.1 vim的基本概念

1.2 vim正常模式命令集

1.2.1 插入模式

1.2.2 移动光标命令

1.2.3 编辑命令

1.3 vim末行模式命令集

贰  Linux编译器 - gcc/g++使用

2.1 gcc如何完成

2.2 几个小问题

2.2.1 条件编译

2.2.2 为什么要编译成汇编文件

2.2.3 动静态库是什么

2.2.4 解决sodu报错

叁  Linux项目自动化构建工具-make/Makefile

3.1 初识makefile

3.2 .PHONY

3.3 完整的依赖关系

3.4 makefile中的写法

3.4.1 第一个版本

3.4.2 第二个版本

3.4.3 最终版本

~ 完 ~


壹  Linux编辑器 - vim使用

1.1 vim的基本概念

vim主要有三种模式,分别是命令模式插入模式底行模式

  • 命令模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
  • 插入模式:只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
  • 底行模式:文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入。

模式的切换:

20b636621cf343909ac119ba9b25b5f3.jpeg

1.2 vim正常模式命令集

★  命令前加数字能更快的进行批量操作 ~

1.2.1 插入模式

  • 按「i」 进入插入模式「insert mode」从光标当前位置开始输入文件;
  • 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
  • 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。

1.2.2 移动光标命令

  • 按「h」、「j」、「k」、 「l」:控制光标左、下、上、右移一格 ~
  • 按[gg]:进入到文本开始 ~
  • 按[shift+g]:进入文本末端 ~
  • 按「$」:移动到光标所在行的行尾 ~
  • 按「^」:移动到光标所在行的行首 ~
  • 按「w」:光标跳到下个单词的开头 ~
  • 按「e」:光标跳到下个单词的字尾 ~
  • 按「b」:光标回到上个单词的开头 ~

1.2.3 编辑命令

复制与黏贴与剪切

  • 「yy」:复制光标所在行 ~
  • 「p」:将缓冲区内的字符贴到光标所在位置 ~
  • 「dd」:剪切并删除光标所在行 ~
  • 「x」:剪切并删除光标所在位置后面的一个字符 ~
  • 「X」:剪切并删除光标所在位置前面的一个字符 ~

撤销

  • 「u」:撤销历史操作 ~
  • 「ctrl + r」: 撤销u的操作 ~

一旦退出文件编辑,无法再进行撤销了~ 没有退出都可以撤销 ~

替换

  • 「r」:替换光标所在处的字符 ~
  • 「R」:【替换模式】替换光标所到之处的字符,直到按下「ESC」键为止 ~
  • 「shift + ~」:小写改大写 ~

查找

  • 「#」:选中单词 ~
  • 「n」:批量查找 ~

批量注释

  • ctrl+v 进入【V-BLOCK模式】 ~
  • (n+) h j k l G 选择要注释行 ~

c5a1e7f61a1747828df40095145f2add.png

  • shift+i 进入【插入模式】,输入第一行的 // ~

b3d7035bbd58460f95d4ff43174c460d.png

  • esc退出【插入模式】 ~

be3a3cdedb9449c6815f76166361b268.png

  • 完成 ~

1.3 vim末行模式命令集

  • 「w」: 文件保存 ~
  • 「q」:退出vim ~
  • 「q!」:强制退出vim ~
  • 「wq」:退出并保存文件 ~
  • 「set nu」:列出行号 ~
  • 「!command」:执行命令 ~
  • 「%s/dst/src/」:批量替换 ~
  • 「vs 文件」:分屏 ~
  • 「ctrl+ww」:切换分屏 ~


贰  Linux编译器 - gcc/g++使用

2.1 gcc如何完成

gcc [选项] 要编译的文件 [选项] [目标文件]

1. 预处理(进行宏替换)

  • 预处理功能主要包括宏定义,文件包含,条件编译,去注释等 ~
  • 预处理指令是以#号开头的代码行 ~
  • 选项“-E”:开始进程程序翻译,预处理完后就停下来 ~
  • 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序 ~
  • gcc –E hello.c –o hello.i

2. 编译(生成汇编)

  • 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言 ~
  • 选项“-S”:开始翻译,编译完后就停下来 ~
  • gcc –S hello.i –o hello.s

3. 汇编(生成机器可识别代码)

  • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件 ~
  • 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了 ~
  • gcc –c hello.s –o hello.o

4. 链接(生成可执行文件或库文件)

  • 在成功编译之后,就进入了链接阶段 ~
  • gcc hello.o –o hello

2.2 几个小问题

2.2.1 条件编译

64f95589148d49f08b6918c4a1443f60.png

命令行级别的宏定义:

gcc test.c -o test -DM
gcc test.c -o test -DM=100

预处理的本质就是修改编辑我们的文本代码~

-DM就是再文本文件中加入#define M 100这样的字符串~

条件编译的作用:

  • 软件进行专业度,收费情况进行区分,使用条件编译,可以进行代码动态裁剪~
  • 内核源代码也是采用条件编译进行代码裁剪~
  • 开发工具,应用软件不同平台下的使用~

2.2.2 为什么要编译成汇编文件

程序的发展是从二进制->汇编语言->c语言->C++/JAVA等。每个阶段都经过了几十年的发展,c语言出现时汇编语言已经很成熟了,把c语言翻译成汇编语言再转换成二进制要比直接翻译成二进制容易得多~

每个语言的发明都要有对应的编译器使他可以翻译成汇编语言,那汇编语言怎么编译成二进制呢?首先在汇编语言出现后,先要发明一个二进制版的编译器,然后用汇编语言写一个汇编编译器,用二进制版的汇编编译器编译一下汇编写的汇编编译器,最后二进制版的就可以不要了,直接用汇编版的进行编译,这就是编译器的自举过程~

2.2.3 动静态库是什么

  • 动态库:Linux (.so)   windows (.dll)
  • 静态库:Linux (.a)     windows (.lib)

库是一套方法或者数据集,为开发提供最基本的保证(基本接口,功能,加速我们的二次开发)~

Linux下的C语言库为 libc.so 和 libc.a ,库的名字为去掉前缀lib和后缀.so/.a后剩余的。

动态库把动态库内部实现的方法和我们自己的程序链接起来,让我们自己的程序能在库中找到方法,形成可执行程序,动态库在执行库中的方法时需要跳转到库中执行,完了再返回。

根据地址的替换来定位~

动态链接的图示

250b29f66b11444bbe725fcd5474e1fc.png

3feb156ccfd8409eb6cdbb3ab0a8df1e.jpeg

静态链接就是把库里的实现拷贝一份到我们自己的代码中,用时调用自己这份实现。静态库只有在链接时有用,一旦形成可执行程序,就不需要静态库了~

动静态库对比

  • 动态库形成的可执行程序体积一定很小~
  • 可执行程序堆静态库的依赖度小,动态库不能缺失~
  • 程序运行需要加载到内存,静态链接的会在内存中出现大量的重复代码~
  • 动态链接比较节省内存和磁盘资源~

ldd命令 - 显示所用库~  c程序默认动态链接

f7161f595c93483f8da743a39b7bb541.png

file命令 - 具体查看类型

8d7e83ab5b054e34afc998d96e3b9bfc.png

ccb4234c1fe4415dbec9a64a7b8bc351.png

如果想要静态链接

2d965eb145e54dd9b577a8917fc5c154.png

5fd161a2faf94f65991f1042c78bb8ff.png

静态链接的可执行文件会大很多~
C++的情况

d0f54b2986e94a0dad869b59aca84d80.png

动态库(共享库)的本质就是把语言层面的公共代码在内存中只出现一份~

2.2.4 解决sodu报错

fc0b089f32e54c44acd13ca4a54c0b95.png

普通用户在sudo时可能会出现以上报错~

解决步骤

  • su -
  • 输入root密码
  • vim /etc/sudoers
  • 找到位置加入:98854433575f48518a55f13a0d080b68.png
  • :wq! 强制退出
  • ctrl+d 退出root

然后就完成辣~

f7c7ac5a7f8048aca8c5f3e314149d20.png


叁  Linux项目自动化构建工具-make/Makefile

3.1 初识makefile

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

makefile带来的好处就是——自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

  • touch Makefile
  • vim Makefile

0f8ec211c677482ca7850b60693e43e7.png

第一行为依赖关系 ~
第二行为tab + 依赖方法 ~

42983d7d69bd44b9a04542005f3c078d.png

上图为使用makefile的方法 ~

84b151ed4a914e0ebca5b27b9ccb5883.png

make命令扫描makefile文件的时候,从上向下扫描,默认形成第一个目标文件  ~

3.2 .PHONY

9c8afb1c510c490287f8f14e3e0250c7.png

93658ee3fca841aebb10ebbdb70448a5.png

.PHONY修饰的每次编译都执行~(本质上是说忽略判断新旧问题

而一般来说gcc编译的不建议加.PHONY修饰,如果源文件不改动,编译就不会执行~

58edec2219ba4994a7f7696276bc5fcd.png

Modify时间是作为知道bin和.c新旧的标准 ~

4a45a82935814e4a9400f380c8015f68.png

3.3 完整的依赖关系

d8f05deb193a4ed39b56c00f05d01d83.png

644f913b49d84e33972c6e3d11f7534c.png

3.4 makefile中的写法

测试方法:

f45a44d1a4c94f82b1c83568ef8b49a1.png

@符号让make不回显~

3.4.1 第一个版本

基于变量版的Makefile ~(类似于宏)

dc39e688f7d044ce968c4043e171f77e.png

BIN和SRC也可以优化掉~

fb74a902163942b19c8a5f20122b9ff3.png

69869a2dc7e64ecbb06e5f88f4778cb7.png

3.4.2 第二个版本

05afc1142b0f4b34b0b2772db6769f9d.png

如果有多个文件呢~

e58f79222fd542baa1d06b7919aa6820.png

8e36654e4e054389a75f25c4f97a8c8f.png

3.4.3 最终版本

a4b45792e5bc4384ad4442f25cd938f2.png

1ec65d9f74874f349a43154be1cb55e8.png

8c29e315f6a7448c825cd0b58d091eb9.png

~ 完 ~

2527de89e9a84e4985c92a24d22ce266.png

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

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

相关文章

solidworks学习6吊环-20241030

solidworks学习6吊环 图 1 使用到的命名&#xff1a;拉伸曲面&#xff0c;旋转曲面&#xff0c;镜像实体&#xff0c;剪裁曲面&#xff0c; 前视基准面绘制 图 2 绘制旋转轴 图 3 旋转曲面 图 4 上视基准面绘制&#xff0c;标准圆边尺寸的时候需要按住shift键标注&#x…

提示词高级阶段学习day4.1

第一步&#xff1a;你要有一个大模型帐号&#xff0c;至少已经熟悉和它们对话的方式。最强性能当属ChatGPT4&#xff0c;当然也推荐国产平替&#xff1a; Kimi.ai - 帮你看更大的世界 智谱清言 第二步&#xff1a;看 OpenAI 的官方文档&#xff1a; 目录&#xff1a;OpenAI …

开源趣味艺术画板Paint Board

什么是 Paint Board &#xff1f; Paint Board 是简洁易用的 Web 端创意画板。它集成了多种创意画笔和绘画功能&#xff0c;支持形状绘制、橡皮擦、自定义画板等操作&#xff0c;并可以将作品保存为图片。 软件功能&#xff1a; 不过非常可惜&#xff0c;老苏最期待的数据同步还…

建设NFS服务器并实现文件共享

关闭防火墙和s0 systemctl stop firewalld setenforce 0 安装NFS yum install nfs-utils -y 新建共享目录并设置权限 echo "hello" > /nfs/shared/test1 chmod -Rf 777 /nfs/shared/ 配置服务端的NFS配置文件 vim /etc/exports /nfs/shared *(ro) 启动…

软件测试学习笔记丨SeleniumPO模式

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22525 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

python通过keyboard库实现模拟/监听键盘

keyboard介绍 如果我们想要通过快捷键&#xff0c;来调用某段代码&#xff0c;我们可以使用python的keyboard库&#xff0c;这个库可以用于发送&#xff0c;挂钩&#xff0c;以及模拟键盘事件等&#xff0c;并且同时支持多种操作系统&#xff08;但是需要注意的是&#xff0c;…

Spring Boot 创建项目详细介绍

上篇文章简单介绍了 Spring Boot&#xff08;Spring Boot 详细简介&#xff01;&#xff09;&#xff0c;还没看到的读者&#xff0c;建议看看。 下面&#xff0c;介绍一下如何创建一个 Spring Boot 项目&#xff0c;以及自动生成的目录文件作用。 Maven 构建项目 访问 http…

windows下安装python库wordCloud报错

换电脑安装wordcloud半天安装失败&#xff0c;记录一下遇到的坑&#xff0c;也给大家节省点时间。 方法1&#xff1a; 错误呢就是下面这个&#xff0c;说没c编译器&#xff0c;要不就去他给的地址上安装一下&#xff0c;我安装了一下好像没什么用&#xff0c;也没太敢勾选&am…

未来之维,陈欣的智能CAD

第一章 新世界的曙光 在不远的未来&#xff0c;人类科技取得了前所未有的进步。人工智能不仅渗透到了生活的每一个角落&#xff0c;而且开始在科学研究、艺术创作乃至人类情感交流中扮演重要角色。在这个充满无限可能的时代&#xff0c;有一位年轻的女工程师——陈欣&#xff…

目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8

目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8 1、.NET Reactor V6.9.8 功能简介2、官方下载 1、.NET Reactor V6.9.8 功能简介 业界领先的源代码保护 .NET Reactor通过多种方法来防止反编译&#xff0c;这些方法会将 .NET 程序集转换为任何现有工具都无法反编译的进程。…

2024 Rust现代实用教程:1.2编译器与包管理工具以及开发环境搭建

文章目录 一、Rust的编译器rustc二、开发环境搭建三、Rust的包管理工具Cargo四、项目结构1.Cargo.toml文件2.创建一个可执行文件项目3.创建一个库项目 参考 一、Rust的编译器rustc 查看版本 rustc-version编译生成二进制文件 rustc -o output filename filename.rs编译生成库…

macOS Sonoma 14.7.1 (23H222) Boot ISO 原版可引导镜像下载

macOS Sonoma 14.7.1 (23H222) Boot ISO 原版可引导镜像下载 2024 年 10 月 28 日&#xff0c;Apple 智能今日登陆 iPhone、iPad 和 Mac。用户现可借助 Apple 智能优化写作&#xff0c;为通知、邮件和消息生成摘要&#xff0c;体验交互更自然、功能更丰富的 Siri&#xff0c;使…

Kafka相关API开发

(一)引入依赖 用API直接去操作kafka(读写数据)在实际开发中用的并不多&#xff0c;学习它主要还是为了加深对Kafka功能的理解。kafka的读写操作&#xff0c;实际开发中&#xff0c;是通过各类更上层的组件去实现。而这些组件在读写kafka数据时&#xff0c;用的当然是kafka的jav…

Backtrader 数据篇 02

Backtrader 数据篇 本系列是使用Backtrader在量化领域的学习与实践&#xff0c;着重介绍Backtrader的使用。Backtrader 中几个核心组件&#xff1a; Cerebro&#xff1a;BackTrader的基石&#xff0c;所有的操作都是基于Cerebro的。Feed&#xff1a;将运行策略所需的基础数据…

Leetcode224 -- 基本计算器及其拓展

题目分析&#xff1a; 其实这个计算器的实现并不难&#xff0c;因为除了括号就剩下加减法嘛&#xff0c;括号肯定比加减法先执行&#xff0c;但是加减法是同级的&#xff0c;只是会改变数字的正负号而已&#xff0c;所以实现的逻辑并不是很难&#xff0c;我们只需要一个栈&…

【jvm】为什么Xms和Xmx的值通常设置为相同的?

目录 1. 说明2. 避免性能开销3. 提升稳定性4. 简化配置5. 优化垃圾收集6. 获取参数6.1 代码示例6.2 结果示例 1. 说明 1.-Xms 和 -Xmx 参数分别用于设置堆内存的初始大小&#xff08;最小值&#xff09;和最大大小。2.在开发环境中&#xff0c;开发人员可能希望快速启动应用程…

瑞芯微RK3566/RK3568 Android11下该如何默认屏蔽导航栏/状态栏?看这篇文章就懂了

本文介绍瑞芯微RK3566/RK3568在Android11系统下&#xff0c;默认屏蔽导航栏/状态栏方法&#xff0c;使用触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566芯片&#xff0c;类树莓派设计&#xff0c;Laval官方社区主荐&#xff0c;已适配全新OpenHarmony5.0 R…

使用AIM对SAP PO核心指标的自动化巡检监控

一、背景 由于SAP PO系统维护成本较高&#xff0c;各类型异常报错等都需要人员进行时刻监控和响应&#xff0c;遂由AIM平台进行自动化巡检SAP PO的各指标&#xff0c;然后告警通知用户&#xff0c;节省维护成本和提高工作效率 二、核心指标监控 SAP PO失败消息 适用于S…

openpnp - 手工修改配置文件(元件高度,size,吸嘴)

文章目录 openpnp - 手工修改配置文件(元件高度,size,吸嘴)概述笔记parts.xmlpackages.xml 手工将已经存在的NT1,NT2拷贝出来改名备注END openpnp - 手工修改配置文件(元件高度,size,吸嘴) 概述 载入新板子贴片准备时&#xff0c;除了引入Named CSV文件&#xff0c;还要在ope…

Centos下安装Maven(无坑版)

Linux 安装 Maven Maven 压缩包下载与解压 华为云下载源&#xff0c;自行选择版本 下面的示例使用的是 3.8.1 版本 wget https://repo.huaweicloud.com/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz解压 tar -zxvf apache-maven-3.8.1-bin.tar.gz移…