最新资讯

  • 我是贝尔格里尔斯,我要向你展示如何入门并熟练掌握世界上最难的操作系统之一linux,这里遍布着数不清的指令,以及完全脱离图形化的界面,没有高超的学习技巧,甚至连一秒都坚持不下去--基础开发

我是贝尔格里尔斯,我要向你展示如何入门并熟练掌握世界上最难的操作系统之一linux,这里遍布着数不清的指令,以及完全脱离图形化的界面,没有高超的学习技巧,甚至连一秒都坚持不下去--基础开发

2025-04-27 22:00:24 0 阅读

孩子们,在踏上linux的征服之旅上,你必须跨过的门槛就是学会使用yum,vim,以及makefile等开发工具的使用,没有这些基础的生存工具,那完全脱离图形化的界面会击溃你,所以让我们赶紧行动起来吧。

1. yum的具体操作

1.1 软件包 

        在Linux下安装软件,一个通常的办法是下载程序的源代码,并进行编译,得到可执行程序。

        但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成Windows上的安装程序)放在一个服务器上,通过包管理器可以很方便地获取到这个编译好的软件包,直接进行安装。
        软件包和软件包管理器,就好比“App”和“应用商店”这样的关系
        yum (Yellow dog Updater, Modified) 是 Linux 下非常常用的一种包管理器,主要应用在 Fedora、RedHat 和 CentOS 等发行版上。使用 yum 可以方便地安装、更新和删除软件包,就类似于我们使用应用宝来管理手机中的app一样。

1.2 linux的生态

        为什么这么多人选择使用linux?为什么我们国家不开发属于自己的的操作系统?最高关键的问题就是在于生态!

         操作系统是给我们程序员去使用,使用的人多了,才有人愿意去为其发现bug,修理bug,完善功能,大家为爱发电之后,操作系统的功能越来越完善了,才会有更多人去使用。

        linux是国外的开发工具,使用由于一些不可抗的因素,我们无法安装国外的软件包。我们使用的是各大高校在国内所建立的镜像网站的资源。

 

 1.3 yum的具体操作

1.3.1 查看软件包

 yum list  命令可以罗列出当前⼀共有哪些软件包.由于包的数量很多,我们使用管道操作加grep命令筛选出我们关注的包。

        • 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
        • "x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配.
        • "el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
        • 最后一列, base 表示的是"软件源"的名称, 类似于"小米应用商店", "华为应用商店"这样的概念.

1.3.2 安装软件

通过yum,我们可以通过很简单的⼀条命令完成gcc的安装.

# Centos
$ sudo yum install -y lrzsz

注意事项:
        • 安装软件时由于需要向系统⽬录中写⼊内容,⼀般需要sudo或者切到root账⼾下才能完成.
        • yum/apt安装软件只能⼀个装完了再装另⼀个.正在yum/apt安装⼀个软件的过程中,如果再尝试⽤ yum/apt安装另外⼀个软件,yum/apt会报错.

1-3-3 卸载软件

# Centos
sudo yum remove [-y] lrzsz

1.4 安装源

#Cetnos
$ ll /etc/yum.repos.d/
total 16
-rw-r--r-- 1 root root 676 Oct 8 20:47 CentOS-Base.repo # 标准源 
-rw-r--r-- 1 root root 230 Aug 27 10:31 epel.repo # 扩展源 

2. vim编辑器

        vim是vi的升级版,vi是早期开发时使用的,用起来非常蛋疼,而vim作为vi的升级版本,堪称promax,vim不但兼容了vi的所有指令,还包含了许多新的特性。

        例如语法加亮,可视化操作不仅可以在终端运⾏,也可运行在x  window、 mac os、 windows。

2.1 vim的基本概念

        首先,我们使用 vim 【文件名】 的指令进行进入vim编辑器

        vim有十几种模式,我们这里讲解最主要用到的5种。如下图所示

 •  正常/普通/命令模式(Norma mode)

        控制屏幕光标的移动,字符、字或⾏的删除,移动复制某区段及进⼊插入模式下,或者到 末行模式,这也是我们进入一进入vim编辑器就处于的模式。

 •  插入模式(Insert mode)

        只有在此模式下才可以编辑文本,进行文字输入,按「ESC」课返回命令模式

 •  末行模式

        ⽂件保存或退出,也可以进⾏⽂件替换,找字符串,列出⾏号等操作。
        在命令模式下,”shift + ;“  (即  “  : ”  )即可进⼊该模式。

 •  替换模式

        命令模式下按“ shift + r” 即可进入,在该模式下,师傅的方式为替换光标处的文字

 •  视图模式

        用于选中特定区域的文本,并对限定区域的文本进行批量操作。

总结:命令模式是最重要的,他是各个模式之间互通的桥梁。

2.2 vim命令模式基础指令

        命令模式主要是沟通各个模式的桥梁,我们主要需要掌握的是从该模式去往其他模式的指令,以及如何从其他模式回到命令模式。

2.3 vim插入模式基础指令

有三种方法从命令模式进入插入模式,这三种方法略有不同

        • 按「i」切换进⼊插⼊模式「insertmode」,按“i”进⼊插⼊模式后是从光标当前位置开始输⼊⽂件;
        • 按「a」进⼊插⼊模式后,是从⽬前光标所在位置的下⼀个位置开始输⼊⽂字;、
        • 按「o」进⼊插⼊模式后,是插⼊新的⼀⾏,从⾏⾸开始输⼊⽂字。

移动鼠标:

注意,在插入模式下我们是无法通过鼠标点击来控制光标的移动的,所以需要键盘使用来控制光标移动

        • vim可以直接⽤键盘上的光标来上下左右移动,但正规的vim是⽤⼩写英⽂字⺟「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移⼀格
        • 按「G」:移动到⽂章的最后
        • 按「 $ 」:移动到光标所在⾏的“⾏尾”
        • 按「^」:移动到光标所在⾏的“⾏⾸”
        • 按「w」:光标跳到下个字的开头
        • 按「e」:光标跳到下个字的字尾
        • 按「b」:光标回到上个字的开头
        • 按「#l」:光标移到该⾏的第#个位置,如:5l,56l
        • 按[gg]:进⼊到⽂本开始
        • 按[shift+g]:进⼊⽂本末端
        • 按「ctrl」+「b」:屏幕往“后”移动⼀⻚
        • 按「ctrl」+「f」:屏幕往“前”移动⼀⻚
        • 按「ctrl」+「u」:屏幕往“后”移动半⻚
        • 按「ctrl」+「d」:屏幕往“前”移动半⻚

删除文字

 • 「x」:每按⼀次,删除光标所在位置的⼀个字符• 「#x」:例如,「6x」表⽰删除光标所在位置的“后⾯(包含⾃⼰在内)”6个字符

• 「X」:⼤写的X,每按⼀次,删除光标所在位置的“前⾯”⼀个字符
• 「#X」:例如,「20X」表⽰删除光标所在位置的“前⾯”20个字符
• 「dd」:删除光标所在⾏
• 「#dd」:从光标所在⾏开始删除#⾏

复制

• 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
• 「#yw」:复制#个字到缓冲区
• 「yy」:复制光标所在⾏到缓冲区
• 「#yy」:例如,「6yy」表⽰拷⻉从光标所在的该⾏“往下数”6⾏⽂字。
• 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须
与 ” p” 配合才能完成复制与粘贴功能。

替换

 •「r」:替换光标所在处的字符。

•「R」:替换光标所到之处的字符,直到按下「ESC」键为⽌。

•撤销上⼀次操作

•「u」:如果您误执⾏⼀个命令,可以⻢上按下「u」,回到上⼀个操作。按多次“u”可以执多次回复。

 撤销上⼀次操作

• 「u」:如果您误执⾏⼀个命令,可以⻢上按下「u」,回到上⼀个操作。按多次“u”可以执⾏ 多次回复。

• 「ctrl + r」: 撤销的恢复

更改

 • 「cw」:更改光标所在处的字到字尾处

• 「c#w」:例如,「c3w」表⽰更改3个字

 跳⾄指定的⾏

• 「ctrl」+「g」列出光标所在⾏的⾏号。

• 「#G」:例如,「15G」,表⽰移动光标⾄⽂章的第15⾏⾸。

 2.4 vim末行模式基础指令

列出⾏号

• 「set nu」:输⼊「set nu」后,会在⽂件中的每⼀⾏前⾯列出⾏号。

跳到⽂件中的某⼀⾏

• 「#」:「#」号表⽰⼀个数字,在冒号后输⼊⼀个数字,再按回⻋键就会跳到该⾏了,如输⼊数字 15,再回⻋,就会跳到⽂章的第15⾏。

 查找字符

• 「/关键字」: 先按「/」键,再输⼊您想寻找的字符,如果第⼀次找的关键字不是您想要的,可以 ⼀直按「n」会往后寻找到您要的关键字为⽌

• 「?关键字」:先按「?」键,再输⼊您想寻找的字符,如果第⼀次找的关键字不是您想要的,可 以⼀直按「n」会往前寻找到您要的关键字为⽌。

 保存⽂件

• 「w」: 在冒号输⼊字⺟「w」就可以将⽂件保存起来

 离开vim

• 「q」:按「q」就是退出,如果⽆法离开vim,可以在「q」后跟⼀个「!」强制离开vim • 「wq」:⼀般建议离开时,搭配「w」⼀起使⽤,这样在退出的时候还可以保存⽂件

2.5 视图模式基础指令

 批量化去注释

hjkl(选中编辑区域)-> shift + i(进入插入模式,因为此模式下才能编辑文本)-> // -> Esc

上述演示只是实例,我们需要明白的是:在视图模式下库批量选择区域,此时再进入插入模式即可进行我们需要的操作实现批量化编辑文本。

2-6 简单vim配置[了解]

常⽤配置选项,⽤来测试

        • 设置语法⾼亮:syntax on

         • 显⽰⾏号: set nu

         • 设置缩进的空格数为4:set shiftwidth=4

插件:虽然插件可以让vim界面更好看,功能更全,但可能会出现一些报错,不建议初学者使用,所以这里不赘述。

3. 编译器gcc/g++

gcc:只能用来编译c语言         g++:课编译c语言和c++

31 背景知识

从一个.c文件到生成可执行程序一共有四步:

        1. 预处理(进⾏宏替换/去注释/条件编译/头⽂件展开等)

        2. 编译(⽣成汇编)

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

        4. 连接(⽣成可执⾏⽂件或库⽂件) 

下面我们主要讲解c语言的编译

3.2 gcc编译语法

格式 :gcc  [选项]  要编译的⽂件  [选项]  [⽬标⽂件] 

3.2.1 预处理

• 选项“-E”,该选项的作⽤是让 gcc 在预处理结束后停⽌编译过程。

• 选项“-o”是指⽬标⽂件, “ .i ” ⽂件为已经过预处理的C原始程序

实例:

 3.2.2 编译

        在这个阶段中,gcc ⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作, 在检查⽆误后,gcc 把代码翻译成汇编语⾔。

• 选项“-S”,该选项的作⽤是让 gcc 在编译结束后停⽌。

实例:

 3.2.3 汇编

• 汇编阶段是把编译阶段⽣成的“.s”⽂件转成⽬标⽂件

实例:

3-2-4 连接 

• 将 -o 文件与库文件进行连接,生成可执行程序

实例:

这个绿色的test就是可执行程序

3.3 动态连接和静态链接

         再实际开发中,我们不可能将所有代码放在一个文件,而是采用多文件的形式存在,并且这多个文件之间并不是独立的,而是存在多种依赖关系

         为了满⾜前⾯说的依赖关系,则需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。这个链接的过程就是静态链接

静态链接的缺点

        1.浪费空间:因为每个可执⾏程序中对所有需要的⽬标⽂件都要有⼀份副本,所以如果多个程序对 同⼀个⽬标⽂件都有依赖,如多个程序中都调⽤了printf()函数,则这多个程序中都含有 printf.o,文件体量很大。

        2. 更新⽐较困难:因为每当库函数的代码修改了,这个时候就需要重新进⾏编译链接形成可执⾏程 序。

静态链接的优点

        1. 运行速度快:在可执⾏程序中已经具备了所有执⾏程序所需要的任何东西,在 执⾏的时候运⾏速度快

        2. 不依赖库:静态链接完毕之后文件中以已经自己包含了相应的库,即使把库删了也不影响。

动态链接的出现解决了静态链接中提到问题

        动态链接的基本思想是把程序按照模块拆分成各个相对 独⽴部分,在程序运⾏时才将它们链接在⼀起形成⼀个完整的程序,⽽不是像静态链接⼀样把所有程序模块都链接成⼀个单独的可执⾏⽂件。

3.4 静态库动态库

在3.3中我们涉及到⼀个重要

yum install glibc-static libstdc++-static -y

的概念:库

        我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该 函数的声明,⽽没有定义函数的实现,那么,是在哪⾥实“printf”函数的呢?

        答案是:系统把这些函数实现都被做到名为 libc.so.6 的库⽂件中去了,在没有特别指定 时,gcc 会到系统默认的搜索路径“/usr/lib”下进⾏查找,也就是链接到  libc.so.6 库函数中去,这样 就能实现函数“printf”了,⽽这也就是链接的作⽤ 

 • 静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件⽐较⼤,但在运 ⾏时也就不再需要库⽂件了。其后缀名⼀般为“.a”

• 动态库与之相反,在编译链接时并没有把库⽂件的代码加⼊到可执⾏⽂件中,⽽是在程序执⾏时由 运⾏时链接⽂件加载库,这样可以节省系统的开销。动态库⼀般后缀名为“.so”,如前⾯所述的 libc.so.6 就是动态库。gcc 在编译时默认使⽤动态库。完成了链接之后,gcc 就可以⽣成可执⾏⽂ 件,如下所⽰。 gcc hello.o –o hello  

⼀般我们的云服务器,C/C++的静态库并没有安装,可以采⽤如下⽅法安装

# Centos
yum install glibc-static libstdc++-static -y

4. 自动化构建-make/makefile

4.1 背景

        一个文件从.c文件到可执行程序一共有四步,尽管我们可以将其合成为一步,但是每个文件都需要我们编译就很繁琐,这时候makefile这个文件就帮我解决了这个问题,他可以批量化理文件。

        一个工程的源文件数不胜数而又分布在若干目录下,而makefile可以让我们来定义一些来的规则,指定哪些文件先编译,哪些后编译等

        当我们有成百上千个.c文件需要编译时,也能通过makefile制定相关规则来批量化自动处理

而完成上述的操作时,只需要写好makefile文件中的规则关系,再实现一个命令“ make ” 即可。

4.2 基本使用

例如我们有一个test.c文件如下所示需要编译

#include 
int main()
{
     printf("hello Makefile!
");
     return 0;
}

在makefile中

myproc:myproc.c
     gcc -o myproc myproc.c
 
.PHONY:clean
clean:
     rm -f myproc

在makfile的文件里,我们需要明确:目标文件,以来文件,以及两者依赖关系和依赖方法

        我们需要编译这个文件去写成一个名为test的可执行程序,那么test这个可执行程序就是我们的目标文件,因为这是我最终要生成的文件。

        并且,我们是通过test.c的文件去生成的,那么test.c就是我们的依赖文件

        那么依赖方法便是我们需要用怎样的指令去生成出对应的文件
        这里便是  gcc -o myproc myproc.c  

        这样,在使用make指令之后,他会去找目标文件的依赖文件,知道找到存在的依赖文件,便开始执行对应的依赖方法。

        值得注意地是,若有多个目标文件以及目标关系,makefile在make时会以压栈的方式从上到下入栈,直到找到了对应的目标文件,在依次出栈执行对应的依赖方法。

         最后,项目工程是需要被清理的。因此我们还有些一个clean的目标文件,但是clean这种,没有被第⼀个⽬标⽂件直接或间接关联,那么它后⾯所定义的命令将不会被⾃动 执⾏。所以我们需要手动的去实现make clean。

        并且向clean的这种目标文件,我们一般将其定义为一个伪⽬标,⽤ .PHONY 修饰,伪⽬标的特性 是,总是被执⾏的,那么何为总是被执行?

我们用stat来查看了我们的test可执行程序的具体属性,这里我们主要关注三个:

        Modify: 内容变更,时间更新。
        Change:属性变更,时间更新。
        Access:常指的是⽂件最近⼀次被访问的时间。

并不是每次运行make,makefile文件都会根据对应关系去执行,而是会根据当前文件的.c文件(依赖文件)的内容变更时间和对应的.exe(目标文件)来判断是否需要执行,而如果在目标文件钱加上.PHONY,则会让make忽略依赖⽂件和⽬标⽂件的时间对⽐。

4.3 推导过程及注意事项

前面提到过makefile文件中的执行逻辑是压栈的方式,这里我们以下面的makefile文件内容为例,逐步详解一下。

myproc:myproc.o 
     gcc myproc.o -o myproc
myproc.o:myproc.s 
     gcc -c myproc.s -o myproc.o
myproc.s:myproc.i 
     gcc -S myproc.i -o myproc.s
myproc.i:myproc.c
    gcc -E myproc.c -o myproc.i
 
.PHONY:clean 
clean: 
    rm -f *.i *.s *.o myproc

        1. make会在当前⽬录下找名字叫“Makefile”或“makefile”的⽂件。

        2. 如果找到,它会找⽂件中的第⼀个⽬标⽂件(target),在上⾯的例⼦中,他会找到 myproc 这 个⽂件,并把这个⽂件作为最终的⽬标⽂件。

        3. 如果 myproc ⽂件不存在,或是 myproc 所依赖的后⾯的 myproc.o ⽂件的⽂件修改时间要 ⽐ myproc 这个⽂件新(可以⽤ touch 测试),那么,他就会执⾏后⾯所定义的命令来⽣成 myproc 这个⽂件。

        4. 如果 myproc 所依赖的 myproc.o ⽂件不存在,那么 make 会在当前⽂件中找⽬标为 myproc.o ⽂件的依赖性,如果找到则再根据那⼀个规则⽣成 myproc.o ⽂件。(这有点像⼀ 个堆栈的过程)

RM=rm -f # 引⼊命令 

        5. 当然,你的C⽂件和H⽂件是存在的啦,于是 make 会⽣成 myproc.o ⽂件,然后再⽤ myproc.o ⽂件声明 make 的终极任务,也就是执⾏⽂件 hello 了。

        6. 这就是整个make的依赖性,make会⼀层⼜⼀层地去找⽂件的依赖关系,直到最终编译出第⼀个 ⽬标⽂件。

需要注意的是,在找寻的过程中,如果出现错误,⽐如最后被依赖的⽂件找不到,那么make就会直接退出,并 报错,⽽对于所定义的命令的错误,或是编译不成功,make根本不理。

make只管⽂件的依赖性,如果在我找了依赖关系之后,冒号后⾯的⽂件还是不在,那么对 不起,我就不⼯作啦。或如果第一给目标文件就找到了对应的依赖文件,并且依赖关系正确,则执行完这一条后就退出,后面的语句就不管了。

 4.4 扩展语法

我们可以自定义变量名称,例如:

BIN=proc.exe # 定义变量  
CC=gcc 

不过在使用的过程中需要注意,自定义的变量使用是 $( 变量名 )  的格式。

如果有100个.c文件需要我们去编译,那么我们不可能写100给makefile,这里我们只需要用一个变量名表示这所有的.c文件即可,这里有两种方法。

SRC=$(shell ls *.c) # 采⽤shell命令⾏⽅式,获取当前所有.c⽂件名 
SRC=$(wildcard *.c) # 或者使⽤ wildcard 函数,获取当前所有.c⽂件名

我们也可以给任意的指令命名

RM=rm -f # 引⼊命令 

总体便是

BIN=proc.exe # 定义变量  
CC=gcc 
#SRC=$(shell ls *.c)                    # 采⽤shell命令⾏⽅式,获取当前所有.c⽂件名 
SRC=$(wildcard *.c)                     # 或者使⽤ wildcard 函数,获取当前所有.c⽂件名 
OBJ=$(SRC:.c=.o)                        # 将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表 

$(BIN):$(OBJ) 
     @$(CC) -o $@ $^                    # $@:代表⽬标⽂件名。 $^: 代表依赖⽂件列表 
     @echo "linking ... $^ to $@" 
%.o:%.c                                 # %.c 展开当前⽬录下所有的.c。 %.o: 同时展开同
                                          名.o
     @$(CC) -c $<                       # %<: 对展开的依赖.c⽂件,⼀个⼀个的交给gcc。 
     @echo "compling ... $< to $@"      # @:不回显命令 
.PHONY:clean 
clean:
     $(RM) $(OBJ) $(BIN) 

5. 版本控制器Git

        当我们在工作时候,常面临提交的方案要改来改去的情况,最后却有可能面临 “感觉不如第一版” 的状况,因此我们选择在每一次版本的改动进行保存,在对应的拷贝文件上进行改动。这种方式在生活中也很常见,例如游戏的版本迭代,我们在网上可以找到一个单机游戏的不同版本的安装包,而我们写项目代码也是一样。

        但在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的⽂件就越来越 多,⽂件多不是问题,问题是:随着版本数量的不断增多,你还记得这些版本各⾃都是修改了什么 吗?

同样的,我们写项目代码也存在这个问题。于是版本控制器应运而生。

5.1 版本控制器

        为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你 了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和 版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。

        ⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的⽂件,例如 doc、excel、dwg、 dgn、rvt等等。对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项⽬中的源代码⽂件!

5.2 Git的安装

        只需要使用yum指令安装对应的安装包即可

yum install git

5.3 建立远端Git仓库

        我们的项目工程保存在了本地,但是一旦设备出问题数据无法恢复便能会很头疼,于是我们国外有github,国内有gitee网站,我们可以在其网站上建立远程仓库,我们可以用将其设为公有这样大家之间可以互相查看资源,也可以设为私有,只允许自己查看。

        在gitee网站上建立好了远程仓库之后,我们便可以将本地的项目代码上传到gitee远程仓库中。一代本地数据丢失了,我们还可以从远程仓库将数据拉取下来。字本地做完改动之后,再将数据上传到远程仓库。

        

        并且在本地,还存在一个暂存区,这是因为我们在本地肯定会对项目代码进行频繁的改动, 为了避免存在避免频繁的上传,在本地修改好的代码都会先存放在暂存区,而后再确定无需再修改之后,统一的将暂存区的代码保存到本地的仓库,再将本地的仓库数据提交同步到远端的git仓库。

5.4 建立本地Git仓库

        在建立好远端仓库之后,会有一个远端仓库的url

我们只需在linux中使用以下代码,便可建立本地的仓库

git clone [url]

 这⾥的 url 就是刚刚建⽴好的项⽬的url,复制过来即可。

5.5 Git三板斧

        在5.3中,我们大致描述了git的同步过程,总体可以分为三步,也成为git三板斧。

5.5.1 git add

        这一步,便是将我们修改或者新建过的文件名加入暂存区。

git add [⽂件名]

5.5.2 git commit

        这一步,是将暂存区的数据统一保存到git的本地仓库,“XXX” 表示日志内容,表明你这次的版本更新都做了什么。

git commit -m "XXX"

5.5.3 git push

        这一步,便是将数据从本地仓库上传更新到远端仓库

git push

当然,首次使用 Git 时,你需要配置你的用户名和邮箱。这些信息将用于标识你在提交代码时的身份。配置用户名和邮箱的命令如下:

# 配置全局用户名
git config --global user.name "Your Name"

# 配置全局邮箱
git config --global user.email "your.email@example.com"

 --global 选项表示这些配置将应用于你系统中的所有 Git 仓库。如果你只想为某个特定的仓库配置用户名和邮箱,去掉 --global 选项即可。

如此,便是git代码的三板斧,会后这些操作便已经足够我们进行项目的开发。

6.  调试器gdb/cgdb的使用

6.1 示例代码

// mycmd.c
#include 

int Sum(int s, int e)
{
     int result = 0;
     for(int i = s; i <= e; i++)
     {
     result += i;
     }
     return result;
}

int main()
{
     int start = 1;
     int end = 100;
     printf("I will begin
");
     int n = Sum(start, end);
     printf("running done, result is: [%d-%d]=%d
", start, end, n);
     return 0;
}

程序的发布⽅式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程 序,默认是 release 模式。

要使⽤gdb调试代码,必须在源代码⽣成⼆进制程序的时候, 加上 -g 选项,如果没有添加,程序⽆法调试

gdb的使用非常难受,所以我们安装cgdb软件包,cgdb的使用相对方便一些,下述操作都是在cgdb上进行。

#cgdb的安装
sudo yum install -y cgdb

6.2 常见使用

开始:cgdb [文件名称]

退出:ctrl + d  或 quit 调试命令 

 

6.3 cgdb实用指令

        有了上述基础指令还不够,这里再介绍三种实用的指令帮助我们进行调试

6.3.1 watch

语法: watch [变量名]

watch指令可以帮助我们监视变量名的变化,在每一次执行语句后若变量名发生变化,那么便会将监视的变量旧值和新值都打印出来

当然其用处一般是:若我们不希望一个变量发生变化,便使用watch对其进行监视,若发生变化了watch便可以告诉我们。

6.3.2 set var

set var 通常用来修改变量的值。这对于调试过程中需要临时更改变量值的情况非常有用。

语法:set var [变量名] = [修改后的值]

当我们程序出现报错,我们想确定是不是某一特定变量导致的错误时,我们可以使用这条语句修改特定变量的值,观察程序运行结果。

例如以下程序

// mycmd.c
#include 
int flag = 0; // 错误 

int Sum(int s, int e)
{
     int result = 0;
     for(int i = s; i <= e; i++)
     {
         result += i;
     }
     return result*flag;
}

int main()
{
     int start = 1;
     int end = 100;
     printf("I will begin
");
     int n = Sum(start, end);
     printf("running done, result is: [%d-%d]=%d
", start, end, n);
     return 0;
}

我们误将flag的值由1写成了0,则会得到以下结果。 

我们使用cgdb调试若想判断是不是flag的错误可以使用语句修改其值

 

修改flag的值后,发现是其造成了值的错误

6.3.3 条件断点

条件断点是使程序运行到特定的情况下停止运行,这再调试中相当实用

语法:b  [行号]  if  [条件]

在我们实例中,执行累加的函数要执行00次,我想跳过前98次,就i观察最后两次的变化就可以使用 b 9 if i==98 ,在使用r之后程序就还跑到i=98的时候停止,这时候我们就可以使用s逐步的观察程序。

7. 总结 

        如上就是我们在开发过程中所用到的开发工具,我们学习了yum的软件包安装,了解了vim编辑器的运用,掌握了makefiel自动化构建的运用,以及了解git三板斧和cgdb的调试器。

        博客知识一种对知识点的总结和归纳,我们需要需要在日常中不断的使用,才能熟练的掌握这些开发用的使用及其技巧。

本文地址:https://www.vps345.com/3917.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 javascript 前端 chrome edge ssh llama 算法 opencv 自然语言处理 神经网络 语言模型 阿里云 网络 网络安全 网络协议 ubuntu deepseek Ollama 模型联网 API CherryStudio 进程 操作系统 进程控制 Ubuntu python MCP 数据库 centos oracle 关系型 安全 分布式 RTSP xop RTP RTSPServer 推流 视频 harmonyos 华为 开发语言 typescript 计算机网络 fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse 深度学习 YOLO 目标检测 计算机视觉 人工智能 filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 HCIE 数通 pycharm ide pytorch ssl 前端框架 tcp/ip numpy asm c# Flask FastAPI Waitress Gunicorn uWSGI Uvicorn android 鸿蒙 flutter Hyper-V WinRM TrustedHosts udp unity java 面试 性能优化 jdk intellij-idea 架构 GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 php 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 Dell R750XS 科技 ai 个人开发 vue.js audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 rust http 学习 uni-app macos adb docker 豆瓣 追剧助手 迅雷 nas 微信 容器 github AI Agent 物联网 ESP32 c++ 单片机 智能手机 NAS Termux Samba Linux aws googlecloud windows 产品经理 agi microsoft vim spring boot websocket 后端 tomcat 微信分享 Image wxopensdk postman mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 mongodb LDAP mysql cuda cudnn anaconda 实时音视频 微服务 springcloud 信息与通信 vscode 腾讯云 笔记 maven intellij idea Windsurf word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 git ansible nginx dubbo .netcore 嵌入式 linux驱动开发 arm开发 嵌入式硬件 智能路由器 外网访问 内网穿透 端口映射 大模型 数据结构 c语言 经验分享 学习方法 运维开发 kamailio sip VoIP 大数据 大数据平台 进程信号 rust腐蚀 .net ollama下载加速 HarmonyOS Next 命名管道 客户端与服务端通信 mcu iot golang 低代码 gitlab jmeter 软件测试 机器学习 自动化 蓝耘科技 元生代平台工作流 ComfyUI gateway Clion Nova ResharperC++引擎 Centos7 远程开发 多线程服务器 Linux网络编程 监控 自动化运维 C 环境变量 进程地址空间 sqlserver conda pillow live555 rtsp rtp node.js json html5 firefox https WSL win11 无法解析服务器的名称或地址 web安全 Kali Linux 黑客 渗透测试 信息收集 django flask web3.py 小程序 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 kubernetes 程序人生 僵尸进程 vue3 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 VMware安装Ubuntu Ubuntu安装k8s k8s efficientVIT YOLOv8替换主干网络 TOLOv8 Qwen2.5-coder 离线部署 代码调试 ipdb Dify 创意 社区 DeepSeek-R1 API接口 源码剖析 rtsp实现步骤 流媒体开发 pip cpu 内存 实时 使用 远程控制 远程看看 远程协助 WSL2 C语言 开源 Ubuntu Server Ubuntu 22.04.5 YOLOv8 NPU Atlas800 A300I pro asi_bench DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 apache jenkins 统信UOS 麒麟 bonding 链路聚合 mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 qt stm32项目 stm32 安装教程 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 debian PVE AI编程 华为云 rabbitmq AIGC react.js 前端面试题 持续部署 gitee redis mybatis oceanbase rc.local 开机自启 systemd ddos ollama llm transformer gpu算力 爬虫 数据挖掘 网络用户购物行为分析可视化平台 大数据毕业设计 1024程序员节 chatgpt llama3 Chatglm 开源大模型 ping++ 深度优先 图论 并集查找 换根法 树上倍增 ffmpeg 音视频 zotero WebDAV 同步失败 代理模式 温湿度数据上传到服务器 Arduino HTTP YOLOv12 fpga开发 银河麒麟服务器操作系统 系统激活 计算机外设 电脑 mac 软件需求 博客 sql KingBase firewalld 负载均衡 SSH 远程连接 鸿蒙系统 系统安全 wireshark 测试工具 gcc 弹性计算 云服务器 裸金属服务器 弹性裸金属服务器 虚拟化 express p2p unity3d 多层架构 解耦 银河麒麟 kylin v10 麒麟 v10 spring Xterminal 微信小程序 开机自启动 DeepSeek 分析解读 SWAT 配置文件 服务管理 网络共享 Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer 远程工作 ue4 着色器 ue5 虚幻 virtualenv 目标跟踪 OpenVINO 推理应用 Netty 即时通信 NIO 系统开发 binder 车载系统 framework 源码环境 华为od nuxt3 半虚拟化 硬件虚拟化 Hypervisor QQ 机器人 bot Docker matlab 边缘计算 智能硬件 micropython esp32 mqtt Reactor 设计模式 C++ IIS服务器 IIS性能 日志监控 能力提升 面试宝典 技术 IT信息化 Linux PID rpc MacMini Mac 迷你主机 mini Apple r语言 数据可视化 数据分析 云原生 postgresql pgpool 宠物 毕业设计 免费学习 宠物领养 宠物平台 计算机 程序员 田俊楠 小艺 Pura X excel sqlite MS Materials openssl 密码学 DNS 业界资讯 模拟退火算法 code-server MQTT mosquitto 消息队列 echarts 信息可视化 网页设计 tcpdump jar gradle 数据库系统 图像处理 C# MQTTS 双向认证 emqx spring cloud kafka hibernate 课程设计 编辑器 CLion IDE 国产操作系统 ukui 麒麟kylinos openeuler 跨域 统信 虚拟机安装 框架搭建 kind VR手套 数据手套 动捕手套 动捕数据手套 vue W5500 OLED u8g2 TCP服务器 chfs ubuntu 16.04 AI大模型 大模型入门 Deepseek 大模型教程 curl wget remote-ssh 蓝桥杯 av1 电视盒子 机顶盒ROM 魔百盒刷机 设置代理 实用教程 网络穿透 zabbix iBMC UltraISO 其他 3d 数学建模 Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 openEuler linux 命令 sed 命令 集成学习 集成测试 bug 火绒安全 RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 具身智能 VPS Nuxt.js 输入法 devops springboot OD机试真题 华为OD机试真题 服务器能耗统计 恒源云 职场和发展 Redis Desktop 远程 命令 执行 sshpass 操作 vSphere vCenter 软件定义数据中心 sddc RTMP 应用层 jupyter SSH 服务 SSH Server OpenSSH Server dify ragflow okhttp CORS 雨云 NPS 孤岛惊魂4 uniapp 服务器数据恢复 数据恢复 存储数据恢复 北亚数据恢复 oracle数据恢复 unix ArcTS 登录 ArcUI GridItem arkUI 传统数据库升级 银行 大语言模型 LLMs IPMITOOL BMC 硬件管理 minicom 串口调试工具 opcua opcda KEPServer安装 oneapi 大模型微调 open webui chrome devtools selenium chromedriver 向日葵 Cursor dba pdf VSCode 华为认证 网络工程师 交换机 移动云 android studio 鲲鹏 FTP 服务器 XCC Lenovo 繁忙 服务器繁忙 解决办法 替代网站 汇总推荐 AI推理 硬件架构 minio embedding 部署 SSL 域名 Anolis nginx安装 环境安装 linux插件下载 safari 系统 系统架构 docker命令大全 5G 3GPP 卫星通信 指令 mariadb list mq rocketmq raid5数据恢复 磁盘阵列数据恢复 shell skynet visualstudio ip命令 新增网卡 新增IP 启动网卡 驱动开发 硬件工程 嵌入式实习 pygame 小游戏 五子棋 sdkman svn Trae AI 原生集成开发环境 Trae AI EasyConnect Cline nvidia ecmascript nextjs react reactjs elasticsearch RustDesk自建服务器 rustdesk服务器 docker rustdesk 黑客技术 Docker Hub docker pull 镜像源 daemon.json 流式接口 ESXi URL 本地部署 api 软件工程 web NFS pyqt java-ee prometheus 监控k8s 监控kubernetes Kylin-Server 服务器安装 openwrt mysql离线安装 ubuntu22.04 mysql8.0 LLM 大模型面经 大模型学习 缓存 源码 ux 多线程 Google pay Apple pay 服务器主板 AI芯片 open Euler dde deepin 混合开发 JDK 交互 WebUI DeepSeek V3 hadoop 网工 opensearch helm bash 搜索引擎 ssrf 失效的访问控制 DevEco Studio 数据集 WebRTC gpt 游戏服务器 TrinityCore 魔兽世界 adobe elk Python 网络编程 聊天服务器 套接字 TCP 客户端 Socket webrtc centos-root /dev/mapper yum clean all df -h / du -sh 京东云 xrdp 远程桌面 threejs 3D 命令行 基础入门 编程 string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap Ubuntu 24.04.1 轻量级服务器 redhat 并查集 leetcode 群晖 文件分享 中间件 iis 雨云服务器 springsecurity6 oauth2 授权服务器 token sas 环境迁移 服务器管理 宝塔面板 配置教程 网站管理 崖山数据库 YashanDB 监控k8s集群 集群内prometheus 直播推流 服务器部署ai模型 Playwright 自动化测试 rsyslog 毕设 相差8小时 UTC 时间 Java linux上传下载 sqlite3 kylin 银河麒麟操作系统 国产化 远程过程调用 Windows环境 k8s集群资源管理 云原生开发 媒体 微信公众平台 risc-v docker run 数据卷挂载 交互模式 vmware 卡死 ipython 飞牛NAS 飞牛OS MacBook Pro 串口服务器 cnn kvm 无桌面 技能大赛 企业微信 Linux24.04 bootstrap html ci/cd ros2 moveit 机器人运动 Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 eureka AI代码编辑器 css 联想开天P90Z装win10 ai小智 语音助手 ai小智配网 ai小智教程 esp32语音助手 diy语音助手 宕机切换 服务器宕机 eNSP 网络规划 VLAN 企业网络 显示过滤器 安装 ICMP Wireshark安装 压力测试 camera Arduino 电子信息 CPU 主板 电源 网卡 linux环境变量 telnet 远程登录 ecm bpm 压测 ECS iftop 网络流量监控 rime make命令 makefile文件 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm idm Minecraft thingsboard visual studio code Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 安卓 iDRAC R720xd Docker Compose docker compose docker-compose playbook IIS .net core Hosting Bundle .NET Framework vs2022 XFS xfs文件系统损坏 I_O error es jvm netty TRAE 磁盘监控 文件系统 路径解析 dell服务器 go gitea 状态管理的 UDP 服务器 Arduino RTOS file server http server web server yum 服务器配置 生物信息学 RAGFLOW RAG 检索增强生成 文档解析 大模型垂直应用 王者荣耀 政务 分布式系统 监控运维 Prometheus Grafana 实时互动 ceph Invalid Host allowedHosts rdp 实验 selete 高级IO SysBench 基准测试 硬件 设备 GPU PCI-Express 医疗APP开发 app开发 jetty undertow UOS 统信操作系统 深度求索 私域 知识库 etcd 数据安全 RBAC Erlang OTP gen_server 热代码交换 事务语义 金融 MNN Qwen ip 腾讯云大模型知识引擎 ui 音乐服务器 Navidrome 音流 ruoyi webstorm MQTT协议 消息服务器 代码 DeepSeek行业应用 Heroku 网站部署 kali 共享文件夹 虚拟机 freebsd hugo 报错 protobuf 序列化和反序列化 Dell HPE 联想 浪潮 docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos 测试用例 功能测试 强制清理 强制删除 mac废纸篓 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 AI写作 AI作画 next.js 部署next.js 聊天室 JAVA 游戏程序 ios asp.net大文件上传 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 .net mvc断点续传 思科模拟器 思科 Cisco Ark-TS语言 灵办AI muduo X11 Xming RAID RAID技术 磁盘 存储 剧本 windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 图形化界面 KVM 计算虚拟化 弹性裸金属 工业4.0 多进程 cmos 网站搭建 serv00 漏洞 微信开放平台 微信公众号配置 VMware GCC crosstool-ng 同步 备份 建站 安全威胁分析 vscode 1.86 Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 VMware安装mocOS macOS系统安装 grafana 直流充电桩 充电桩 IPMI wsl2 wsl Ubuntu共享文件夹 共享目录 Linux共享文件夹 seatunnel g++ g++13 Cookie 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 软件构建 arcgis rag ragflow 源码启动 我的世界服务器搭建 minecraft 备选 网站 调用 示例 银河麒麟桌面操作系统 Kylin OS 运维监控 AD域 k8s二次开发 集群管理 tcp 游戏机 IMX317 MIPI H265 VCU pyautogui 毕昇JDK HTTP 服务器控制 ESP32 DeepSeek prompt 本地部署AI大模型 mamba Vmamba LInux vasp安装 查询数据库服务IP地址 SQL Server 语音识别 AutoDL 代理 信号 分布式训练 wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 OpenManus 宝塔 qt项目 qt项目实战 qt教程 英语 EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP DeepSeek r1 Open WebUI npm cd 目录切换 Node-Red 编程工具 流编程 根服务器 tensorflow 华为机试 eclipse 游戏引擎 NLP模型 NLP AISphereButler 策略模式 单例模式 自学笔记 小米 澎湃OS Android clickhouse outlook miniapp 真机调试 调试 debug 断点 网络API请求调试方法 银河麒麟高级服务器 外接硬盘 Kylin apt 国内源 程序员创富 做raid 装系统 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 bat 需求分析 规格说明书 langchain deep learning 网络结构图 HarmonyOS 升级 CVE-2024-7347 rustdesk 7z frp 内网服务器 内网代理 内网通信 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 DIFY 自动化任务管理 keepalived epoll easyui sonoma 自动更新 dns 反向代理 xshell termius iterm2 neo4j 数据仓库 数据库开发 database big data 相机 权限 飞书 致远OA OA服务器 服务器磁盘扩容 web3 xcode yum源切换 更换国内yum源 链表 arm 服务网格 istio rclone AList webdav fnOS 单一职责原则 匿名管道 推荐算法 fd 文件描述符 飞牛nas fnos log4j CDN Headless Linux 飞牛 文心一言 matplotlib asp.net大文件上传下载 Linux的基础指令 序列化反序列化 可信计算技术 vr ruby spark HistoryServer Spark YARN jobhistory 安全架构 zookeeper AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 nfs 免费域名 域名解析 历史版本 下载 DocFlow flink 自定义客户端 SAS etl 语法 僵尸世界大战 游戏服务器搭建 图形渲染 GIS 遥感 WebGIS 黑苹果 LORA 大大通 第三代半导体 碳化硅 回显服务器 UDP的API使用 Linux的权限 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 Windows ai工具 v10 软件 ldap armbian u-boot 捆绑 链接 谷歌浏览器 youtube google gmail c/c++ 串口 影刀 #影刀RPA# 项目部署到linux服务器 项目部署过程 ftp banner alias unalias 别名 c AnythingLLM AnythingLLM安装 vscode1.86 1.86版本 ssh远程连接 SSE 迁移指南 LLM Web APP Streamlit regedit 开机启动 用户缓冲区 模拟实现 cpp-httplib 支付 微信支付 开放平台 实习 MI300x Claude SenseVoice figma 开发环境 SSL证书 hive Hive环境搭建 hive3环境 Hive远程模式 qemu libvirt WSL2 上安装 Ubuntu sysctl.conf vm.nr_hugepages webgl WebVM 基础环境 流水线 脚本式流水线 vpn 考研 cocoapods DenseNet CrewAI SRS 流媒体 直播 云服务 版本 dash 正则表达式 视觉检测 VMware创建虚拟机 yolov8 odoo 服务器动作 Server action can 线程池 Kali 渗透 tidb GLIBC GoogLeNet flash-attention ArkTs ArkUI 视频编解码 USB网络共享 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 无人机 UOS1070e Mac内存不够用怎么办 代码托管服务 网络药理学 生信 gromacs 分子动力学模拟 MD 动力学模拟 Ubuntu22.04 开发人员主页 移动魔百盒 trea idea USB转串口 CH340 自动化编程 swoole 邮件APP 免费软件 三级等保 服务器审计日志备份 FTP服务器 ssh漏洞 ssh9.9p2 CVE-2025-23419 多个客户端访问 IO多路复用 TCP相关API 架构与原理 软考 RAGFlow 本地知识库部署 DeepSeek R1 模型 lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 n8n dity make tailscale derp derper 中转 triton 模型分析 矩阵 线性代数 电商平台 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors 键盘 IDEA 互信 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 powerpoint 单元测试 DOIT 四博智联 Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 perf Unity Dedicated Server Host Client 无头主机 lua vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 DBeaver kerberos 网络攻击模型 cursor MCP server C/S aarch64 编译安装 HPC windows日志 Deepseek-R1 私有化部署 推理模型 iphone 实战案例 性能测试 音乐库 安防软件 firewall openstack Xen 端口测试 H3C cfssl composer 常用命令 文本命令 目录命令 产测工具框架 IMX6ULL 管理框架 python3.11 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 远程服务 Logstash 日志采集 sentinel 前后端分离 Typore nac 802.1 portal ROS 自动驾驶 midjourney Jellyfin FunASR ASR 聚类 佛山戴尔服务器维修 佛山三水服务器维修 TrueLicense x64 SIGSEGV xmm0 稳定性 看门狗 信号处理 MacOS录屏软件 Wi-Fi 超融合 强化学习 Spring Security 我的世界 我的世界联机 数码 yaml Ultralytics 可视化 串口驱动 CH341 uart 485 干货分享 黑客工具 密码爆破 虚拟局域网 技术共享 Linux环境 云电竞 云电脑 todesk 交叉编译 显卡驱动 大模型应用 OpenSSH 昇腾 npu bcompare Beyond Compare 模拟器 教程 ISO镜像作为本地源 gpt-3 执法记录仪 智能安全帽 smarteye 主从复制 人工智能生成内容 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 IPv4 子网掩码 公网IP 私有IP EMUI 回退 降级 dns是什么 如何设置电脑dns dns应该如何设置 xss 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 linux安装配置 ocr seleium pppoe radius 嵌入式Linux IPC gaussdb 双系统 GRUB引导 Linux技巧 线程 saltstack P2P HDLC AI agent IM即时通讯 剪切板对通 HTML FORMAT xml 算力 阿里云ECS Radius uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 lio-sam SLAM uv glibc wps edge浏览器 社交电子 ubuntu24.04.1 EMQX 通信协议 VS Code IO模型 换源 Debian 软负载 AI-native Docker Desktop 虚拟显示器 AD 域管理 trae 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? 读写锁 ros 显示管理器 lightdm gdm 办公自动化 自动化生成 pdf教程 rnn 重启 排查 系统重启 日志 原因 游戏开发 阻塞队列 生产者消费者模型 服务器崩坏原因 laravel less 小智AI服务端 xiaozhi TTS 工作流 workflow junit 程序 性能分析 HarmonyOS NEXT 原生鸿蒙 MDK 嵌入式开发工具 论文笔记 sublime text deekseek rpa fstab 知识图谱 沙盒 计算生物学 生物信息 基因组 Linux find grep 钉钉 信创 信创终端 中科方德 onlyoffice 端口聚合 windows11 react native 抓包工具 System V共享内存 进程通信 SVN Server tortoise svn docker desktop image ubuntu20.04 ros1 Noetic 20.04 apt 安装 ABAP CentOS Stream CentOS 网络建设与运维 HAProxy top Linux top top命令详解 top命令重点 top常用参数 HiCar CarLife+ CarPlay QT RK3588 存储维护 NetApp存储 EMC存储 xpath定位元素 端口 查看 ss ShenTong docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 word autodl 镜像 nlp 企业网络规划 华为eNSP IMM 智能音箱 智能家居 金仓数据库 2025 征文 数据库平替用金仓 wpf 合成模型 扩散模型 图像生成 Xinference 软件卸载 系统清理 OpenHarmony 鸿蒙开发 移动开发 wsgiref Web 服务器网关接口 Qwen2.5-VL vllm 李心怡 nosql ardunio BLE sequoiaDB java-rocketmq perl Python基础 Python教程 Python技巧 内网环境 h.264 WLAN prometheus数据采集 prometheus数据模型 prometheus特点 Linux权限 权限命令 特殊权限 docker部署Python win服务器架设 windows server zip unzip 软链接 硬链接 网卡的名称修改 eth0 ens33 PX4 本地化部署 网络爬虫 在线office chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 MacOS 私有化 db 玩机技巧 软件分享 软件图标 增强现实 沉浸式体验 应用场景 技术实现 案例分析 AR 多路转接 MySql 进程优先级 调度队列 进程切换 kernel 区块链 kotlin ssh远程登录 虚幻引擎 virtualbox 问题解决 ubuntu24 vivado24 Sealos harmonyOS面试题 浏览器开发 AI浏览器 visual studio rancher 烟花代码 烟花 元旦 性能调优 安全代理 嵌入式系统开发 网络搭建 神州数码 神州数码云平台 云平台 KylinV10 麒麟操作系统 Vmware deepseek r1 su sudo ranger MySQL8.0 环境配置 防火墙 NAT转发 NAT Server 代理服务器 粘包问题 ip协议 欧标 OCPP searxng PPI String Cytoscape CytoHubba 树莓派 VNC TCP协议 抗锯齿 拓扑图 域名服务 DHCP 符号链接 配置 navicat Unity插件 milvus iventoy VmWare OpenEuler css3 健康医疗 互联网医院 云桌面 微软 AD域控 证书服务器 Attention 极限编程 MVS 海康威视相机 浏览器自动化 大模型部署 查看显卡进程 fuser ArtTS 加解密 Yakit yaklang UDP proxy模式 流量运营 带外管理 服务器时间 磁盘清理 SSH 密钥生成 SSH 公钥 私钥 生成 大模型推理 容器技术 vu大文件秒传跨域报错cors jina docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 gnu iperf3 带宽测试 nvm whistle llama.cpp 中兴光猫 换光猫 网络桥接 自己换光猫 多端开发 智慧分发 应用生态 鸿蒙OS 对比 工具 meld DiffMerge 开发 QT 5.12.12 QT开发环境 Ubuntu18.04 项目部署 状态模式 个人博客 hosts 物联网开发 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK 元服务 应用上架 云耀服务器 SEO 上传视频文件到服务器 uniApp本地上传视频并预览 uniapp移动端h5网页 uniapp微信小程序上传视频 uniapp app端视频上传 uniapp uview组件库 grub 版本升级 扩容 AI Agent 字节智能运维 hexo fast deployment daemonset statefulset cronjob 达梦 DM8 数字证书 签署证书 风扇控制软件 智能电视 热榜 搜狗输入法 中文输入法 接口优化 离线部署dify 服务器正确解析请求体 AI员工 IO js 西门子PLC 通讯 yolov5 解决方案 vnc yum换源 MobaXterm 开机黑屏 电视剧收视率分析与可视化平台 搭建个人相关服务器 论文阅读 centos 7 像素流送api 像素流送UE4 像素流送卡顿 像素流送并发支持 MAVROS 四旋翼无人机 conda配置 conda镜像源 通信工程 毕业 ubuntu 18.04 openvpn server openvpn配置教程 centos安装openvpn 安装MySQL dock 加速 虚拟现实 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 macOS