Linux的基础开发工具

Linux的基础开发工具

目录

前言:

1、包管理器yum

1.1 软件包的依赖

1.2 镜像源

1.3 查找/安装/卸载软件

2、编辑器vim

2.1 命令模式(默认)

2.1.1 撤销与反撤销

2.1.2 光标定位

2.1.3 复制&&剪切(删除)&&粘贴

2.1.4 替换

2.1.5 插入模式

2.1.6 V-Block模式

2.2 底行模式

2.3 命令行使用vim的技巧

2.4 vim的配置

3、编译器gcc/g++

3.1 预处理

3.2 编译

3.3 汇编

3.4 链接

3.4.1 动态库(动态链接)

3.4.2 静态库(静态链接)

3.4.4 库的本质

两个编译过程:

4、自动化构建工具make/Makefile

4.1 make

4.2 Makefile

1. 目标 (Target)

2. 依赖 (Prerequisites)

3. 命令 (Recipe)

4.3 Makefile的一些细节

5、版本控制器git

5.1 安装和clone

5.2 add&&commit&&push

5.3 其他操作

6、调试器gdb/cgdb

6.1 预备知识

6.2 常用指令

1. r&&q

2. 断点

3. 跳转

4. 查看


前言:

作者使用的是Centos7.9

现在开始使用普通用户(root用户权限太高,有点危险),需要更高的权限sudo即可

1、包管理器yum

Centos,一般使用yum下载软件。Ubuntu,用apt,类似。

1.1 软件包的依赖

yum,会解决 包的依赖 问题(即一起帮你下载)。

1.2 镜像源

Linux通过内置链接下载软件,可是由于国家安全(不能访问外网),内地社区就拷贝资源使用自己社区的链接

镜像站官网支持发行版
清华大学https://mirrors.tuna.tsinghua.edu.cnCentOS, Ubuntu, Debian, Arch, EPEL
阿里云https://mirrors.aliyun.comCentOS, Ubuntu, Docker
华为云https://mirrors.huaweicloud.comCentOS, Ubuntu
网易http://mirrors.163.comUbuntu, Debian
中科大https://mirrors.ustc.edu.cnArch Linux, Docker

可以通过更改yum的配置文件更改下载链接(从哪里下载)。

1.3 查找/安装/卸载软件

yum list 有哪些安装包 yum list | grep 安装包 查找指定的安装包 sudo yum install -y 安装包 下载指定的安装包 -y确认下载 sudo yum remove -y 软件 删除指定的软件 -y确认删除

注意:

安装删除需要root权限

安装到系统目录(不是其他用户的家目录),任何人都能使用

2、编辑器vim

注意:
Esc
,可能有点慢。 

2.1 命令模式(默认)

2.1.1 撤销与反撤销
  • u撤销
  • Ctrl+r撤销u操作反撤销

注意:一旦退出就不能撤销了

2.1.2 光标定位

可以先通过底行模式,显示行号。

  • gg,光标定位到第一行 第一个非空字符n+gg,光标定位到第n行 第一个非空字符
  • G(shift+g),光标定位到最后一行 第一个非空字符n+G,光标定位到第n行 第一个非空字符
  • ^(shift+6),光标定位到光标所在行第一个非空白字符
  • $(shift+4),光标定位到光标所在行最后一个字符
  • ((((),键盘的上下左右键在一些场景下不可用。n+hjkl,移动n个字符
  • b,移动到上一个单词的首字母n+b,移动到上n个单词的首字母
  • w,移动到下一个单词的首字母n+w,移动到下n个单词的首字母

搜索:

  • #(shift+3),向上搜索 当前光标下的单词n上一个(正向搜索),N下一个(反向搜索)。
  • *(shift+8),向下搜索 当前光标下的单词n下一个(正向搜索),N上一个(反向搜索)。

可以通过底行模式,删除高亮。

2.1.3 复制&&剪切(删除)&&粘贴
  • yy复制 当前行n+yy复制 从当前行开始的n行。p,在下一行新建一行,粘贴。
  • dd剪切(删除) 当前行n+dd剪切(删除) 从当前行开始的n行
  • x剪切(删除)光标位置的字符n+x剪切(删除) 从光标开始n个字符
  • X(shift+x),剪切(删除)光标前面的字符n+X剪切(删除) 光标前面n个字符

对于yydd

  • p粘贴光标下面的新建行  P(shift+p),粘贴光标上面的新建行

当然,也可以n+pn+P粘贴n次

对于xX

  • p粘贴光标前面   P(shift+p),粘贴光标后面。

当然,也可以n+pn+P粘贴n次

2.1.4 替换
  • r替换 光标所在的字符n+r替换 光标及后面n个字符
  • R(shift+r),命令模式进入替换模式直接替换
  • ~(shift+`),大小写切换n+~,将光标及后面n个字符 切换大小写
2.1.5 插入模式

插入模式可以插入字符

  • i,命令模式进入插入模式,光标不动
  • a,命令模式进入插入模式,光标后移一位
  • o,命令模式进入插入模式,向下新建一行光标在新建行的行首
2.1.6 V-Block模式

Ctrl+v,进入V-Block模式

常用于:

批量注释

Ctrl+v(进入V-Block模式),

hjkl(选择区域,也可以n+hjkl),

shift+i,进入插入模式,输入//,

Esc,进入命令模式,就一起注释了。

批量删除注释

Ctrl+v(进入V-Block模式),

hjkl(选择区域,也可以n+hjkl),

直接x(删除光标位置的字符),自动切换到命令模式。

2.2 底行模式

  • :(shift+;),英文的冒号,命令模式进入底行模式
  • set nu显示行号set nonu取消行号
  • %s/src/dst/,批量替换把所有的src换成dst
  • vs new_src再打开一个new_src源文件Ctrl+ww光标切屏
  • w(保存vim),q(退出vim),q!(强制退出vim),wq(保存并退出vim),wq!(强制保存并退出vim)。

2.3 命令行使用vim的技巧

在命令行,

  • vim不存在的文件,只要w(保存),文件会自动生成
  • vim 文件 +n,+号要写,打开文件光标直接跳到第n行,方便快速定位编译报错的位置
  • !v执行 最近v开头的命令

2.4 vim的配置

vim,没有自动缩进,没有自动补齐等等,用起来不太方便,需要一些配置。

这里推荐一个自动化配置(自己配置比较麻烦):

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

注意:

普通用户下一键式安装(root用户容易出问题)。就改变了普通用户的vim配置。

只支持Centos7

失败就多试几次安装成功后,可能需要重启一下

默认是两个空格的缩进。

如果要改成四个空格的缩进,vim 家目录下的vimrc,

都改成4。

3、编译器gcc/g++

gcc/g++ 默认情况下会执行完整的编译流程,包括 预处理、编译、汇编、链接 这四个步骤,并最终生成可执行文件(或库)。

gcc只能编译.c文件,g++既能编译.c文件也能编译.cpp文件,其他基本相同,以下以gcc为例。

// 将code.c编译为code的两种格式 gcc code.c -o code // 常用 gcc -o code code.c

3.1 预处理

  • 修改代码,通过头文件展开宏替换条件编译(进行功能裁剪),去注释等。
  • -E 选项进行预处理
  • 生成 .i 文件。
gcc -E code.c -o code.i

3.2 编译

  • 预处理后的代码转换为汇编代码
  • -S 选项生成汇编代码
  • 生成 .s 文件。
gcc -S code.i -o code.s

3.3 汇编

  • 汇编代码转换为机器码(CPU能直接执行的二进制指令)。
  • -c 选项生成汇编代码
  • 生成 .o 目标文件。
  • 每个源文件都编译成对应的.o文件,能以较小的成本将代码程序编译。
gcc -c code.s -o code.o gcc -c code.c // 默认生成,同名的.o文件 

3.4 链接

  • 多个 .o 目标文件库文件(.so/.a)合并,生成最终的可执行文件或动态库。
  • 直接运行 gcc 或 g++ 默认会执行链接
gcc code.o -o code gcc -o code code.o // 或者

Linux中,是lib+库名+后缀。 

注意:

自己写可执行程序,需要指定目录,才能执行./(当前目录)

3.4.1 动态库(动态链接)
  • Linux,.so后缀,Windows,.dll后缀。
  • 动态库,又称共享库,被多程序共享。可执行程序的动态库不能缺失。
  • 执行目标方法需跳转到库中。文件体积小。

ldd 可执行文件动态库,可以查看 需要的动态库

3.4.2 静态库(静态链接)
  • Linux,.a后缀,Windows,.lib后缀。
  • 执行目标方法,会将方法拷贝过来再执行。文件体积大。可执行程序的对静态库的依赖度小。
3.4.4 库的本质

库可以理解为,.o文件.h文件集合

一般把文件编译.o文件,再与库文件 链接,形成可执行程序。

两个编译过程:

1. 文件包含1.h(有方法的声明),可以过编译这关,然后给1.o(有方法实现),链接,没问题。

2. C++模板不支持声明和定义分离到.h.c,因为文件虽然包含了.h,预处理展开头文件,编译时实例化了声明,可以过编译这关,但是.o的方法没有实例化,所以链接时找不到方法的实现,所以有问题。

4、自动化构建工具make/Makefile

4.1 make

make,是命令,可以指定目标,默认执行当前目录下Makefile中的第一个目标

4.2 Makefile

Makefile或makefile,是文件(包含编译的指令 或 各种自动化任务)。

Makefile 主要由以下三部分组成:

目标(target): 依赖(prerequisites) [TAB]命令(recipe)
1. 目标 (Target)
  • 通常是最终要生成的文件名(如 main.o
  • 也可以是一个操作名称(如 clean
  • 一个 Makefile 可以有多个目标
2. 依赖 (Prerequisites)
  • 构建目标所需的文件或其他目标
  • 可以是多个文件,用空格分隔
  • 如果依赖文件比目标文件新(目标文件应该是更新的,因为最后生成的是目标文件,当依赖文件被修改了,此时依赖文件更新,会重新编译),make 会重新构建目标。(即当改了依赖文件make 会重新构建目标)

注意:

通过文件Modify(最近文件内容修改时间)判断是否更新

默认没改依赖文件,就不会重新构建目标。这里会引出一个问题。如果

clean: rm -f *.o main

当执行 make clean 时,rm -f *.o main 会正常执行。

但是如果当前目录下恰好存在一个名为 clean 的文件或目录,make 会认为 clean 目标已经是最新的(因为 clean 没有依赖项),从而拒绝执行 rm 命令。

加上 .PHONY 的作用

.PHONY: clean clean: rm -f *.o main
  • 明确声明 clean 是伪目标(不是实际文件),强制 make 执行其命令,无论是否存在同名文件。
  • 避免意外行为:即使有人创建了 clean 文件,make clean 也能正确执行清理操作
  • 提高可读性:明确告知开发者这是一个用于执行操作(而非生成文件)的目标。
3. 命令 (Recipe)
  • 必须以 Tab 开头(不能用空格代替)
  • 是要执行的 shell 命令
  • 可以有多条命令,每条占一行

4.3 Makefile的一些细节

1. 直接make默认执行第一个目标test(因为依赖,所以不断执行),test依赖test.o,test.o依赖test.c,所以先生成test.o,再生成test。

2. 执行的命令会回显,前面加@不会回显了。如:

3. Makefile 中确实使用了类似宏定义(变量)和类似解引用(变量展开)的机制。这种设计使得 Makefile 更加灵活和可维护。如:

# 变量定义 需要$(),类似于解引用,才能使用 CC := gcc TARGET := myprogram SRCS := main.c test.c # 空格隔开 # SRC := $(wildcard *.c) # 当前目录下所有的.c文件 OBJS := $(SRCS:.c=.o) # 将 .c 替换为 .o # 默认目标 $(TARGET): $(OBJS) $(CC) -o $@ $^ # $@,是目标,@^,是所有的依赖 # 模式规则:编译 .c 到 .o,.c为当前目录下的.c,只编译需要的.o %.o: %.c $(CC) -c $< # 默认生成同名的.o文件 # $<,是单个依赖,将.c分别编译为.o # 伪目标 .PHONY: clean clean: rm -f $(OBJS) $(TARGET) 

5、版本控制器git

5.1 安装和clone

安装git 

sudo yum install -y git

在gitee创建远端仓库,

点击克隆/下载,复制https的地址

将远端仓库克隆到本地。

git clone https地址

5.2 add&&commit&&push

可以多次add,然后一次commit,push。 

  • git add 工作区的dir/file。
  • git push(需要gitee的名字和登入密码)。

git commit -m "日志信息"。第一次commit,需填写gitee名字邮箱


运行下面的两个指令。

注意:

一个文件/目录,每次提交修改都需要add,commit,push

Windows的小乌龟第一次add,commit,push,后面只需commit,push,简化了而已。

5.3 其他操作

  • git log,查看提交记录。
  • git status。检查哪些文件被修改(但未暂存);查看哪些文件已暂存(准备提交);显示未跟踪的文件(新文件,Git 尚未管理);提示当前分支状态(是否与远程分支同步)。
  • git pull,将远程仓库同步到本地。(远程仓库认为是最新的,当本地仓库和远端仓库不同时,需要同步)
  • 删除本地仓库和远程仓库的文件,git rm 文件名,删除了本地仓库文件,git commit -m "删除文件名",git push,删除了远程仓库文件。
  • 本地仓库 中,将一些文件移动到一个新建的目录下,mkdir 新目录名,git mv 文件(可多个) 新目录名

6、调试器gdb/cgdb

6.1 预备知识

1. 程序发布模式

  • Debug模式:包含调试信息,便于调试程序
  • Release模式默认模式,不包含调试信息,程序更高效
gcc code.c -o code // gcc/g++默认release模式 gcc code.c -o code -g // -g添加调试信息 

2.  gdb不太好用,再下载个cgdb,封装一层,便于调试

sudo yum install -y gdb sudo yum install -y cgdb

3. cgdb 携带调试信息可执行程序

6.2 常用指令

1. r&&q
  • r/run启动调试并开始执行程序。或重新调试并执行程序
  • q/quit,退出cgdb。
2. 断点

注意:

一般是在run之前打断点

  • b行号。在该行断点b 函数名。在函数的入口断点
  • b 行号 if 条件。在该行打条件断点
  • info b查看断点。cgdb不退出,断点的编号一直增加。
  • d 断点编号删除断点
  • disable断点编号禁用断点
  • enable 断点编号启用断点
3. 跳转
  • n/next。逐过程,类似于vs2022的f10。
  • s/step。逐语句,类似于vs2022的f11。
  • c跳到逻辑上的下一个断点
  • until 行号。执行到指定行号。 默认只在 当前函数内 生效,方便局部跳转
  • finish。直接执行完当前函数

tip:回车——执行最近的gdb命令

4. 查看
  • p 变量/表达式。显示变量/表达式的值
  • info locals。显示当前栈帧局部变量的值
  • display 变量/表达式一直显示变量的值undisplay 编号不再显示
  • watch 变量/表达式。只有值变化才显示。是一种断点,通过d 断点编号,删除。
  • bt。显示当前函数的调用栈
  • set var 变量名=值手动修改变量的值。

Read more

优雅终结启动顺序噩梦:ObjectProvider —— Spring 4.3 开始引入

优雅终结启动顺序噩梦:ObjectProvider —— Spring 4.3 开始引入

🧑 博主简介:ZEEKLOG博客专家,「历代文学网」(PC端可以访问:https://lidaiwenxue.com/#/?__c=1000,移动端可关注公众号 “ 心海云图 ” 微信小程序搜索“历代文学”)总架构师,首席架构师,也是联合创始人!16年工作经验,精通Java编程,高并发设计,分布式系统架构设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。 🤝商务合作:请搜索或扫码关注微信公众号 “ 心海云图 ” 优雅终结启动顺序噩梦:ObjectProvider —— Spring 4.3 开始引入 从“饥渴式依赖”到“按需获取”,一次依赖注入的思想跃迁 缘起:一个再普通不过的配置类,为何启动就报错?

By Ne0inhk
【MySQL数据库基础】(五)MySQL 数据类型深度解析:选对类型 = 性能拉满!

【MySQL数据库基础】(五)MySQL 数据类型深度解析:选对类型 = 性能拉满!

前言         在 MySQL 表结构设计中,数据类型的选择是最核心也最容易踩坑的环节。很多开发者随手给字段设为int、varchar(255),看似省事,实则会导致磁盘空间浪费、查询效率低下,甚至出现数据溢出、精度丢失的问题。         选对数据类型的本质,是用最小的存储空间存储符合业务需求的数据,这不仅能节省服务器资源,还能提升索引和查询的效率。本文将从 MySQL 的四大核心数据类型(数值、字符串、日期时间、枚举集合)出发,结合实战案例讲透每种类型的用法、边界、坑点,还有不同场景下的选择技巧,让你从根源上做好表结构设计!下面就让我们正式开始吧! 一、数据类型总览:四大类覆盖所有业务场景         MySQL 提供了丰富的数据类型,按用途可分为数值类型、字符串类型、日期时间类型和特殊字符串类型(ENUM/SET),不同类型对应不同的存储规则和业务场景,核心设计原则是按需选择,宁小勿大。         先看一张核心数据类型分类表,快速建立整体认知: 分类核心类型适用场景数值类型TINYINT/INT/BIGINT/FLOAT/

By Ne0inhk
告别“Vibe Coding”——BMAD方法论与全能AI团队入门——必学!BMAD 方法论架构从入门到精通

告别“Vibe Coding”——BMAD方法论与全能AI团队入门——必学!BMAD 方法论架构从入门到精通

告别“Vibe Coding”——BMAD方法论与全能AI团队入门 文章目录 * 告别“Vibe Coding”——BMAD方法论与全能AI团队入门 * 摘要 * 1.1 “Vibe Coding”的痛点与BMAD的核心价值 * 1.2 BMAD核心原理与架构图 * BMAD架构图(可视化闭环流程) * 1.3 BMAD核心概念(入门必懂) * 1.4 环境安装与配置(新手友好,一步到位) * 1. 安装bmad-builder工具 * 2. 配置AI编码插件(以VS Code + Claude Code为例) * 1.5 入门实战:Hello BMAD 示例(手把手落地) * 需求明确 * 实战步骤(基于bmad-builder) * 3. 运行结果与解读 * 1.

By Ne0inhk
一文通关 MySQL 数据类型,打好高性能数据库的第一战!

一文通关 MySQL 数据类型,打好高性能数据库的第一战!

🔥海棠蚀omo:个人主页                 ❄️个人专栏:《初识数据结构》,《C++:从入门到实践》,《Linux:从零基础到实践》,《Linux网络:从不懂到不会》,《MySQL:新手入门指南》                 ✨追光的人,终会光芒万丈 博主简介: 目录 一.数值类型 1.1tinyint类型 1.2bit类型 二.小数类型 2.1float类型 2.2decimal类型 三.字符串类型 3.1char类型 3.2varchar类型 3.3char和varchar的比较 四.日期和时间类型 五.enum和set 5.1查询set中的数据 前言: 在上一篇文章中,我们学习了库和表的相关操作,而在我们上一篇的讲解中,我们提到了在列名后面跟的是数据类型,但是对于MySQL中的数据类型我们现在还一知半解,那么今天这篇文章我们就来详细谈一谈MySQL中的数据类型。 那么在详细讲解每种数据类型之前,

By Ne0inhk