YUM(Yellowdog Updater, Modified)是 Linux 系统中的一个软件包管理工具,主要用于安装、更新、卸载和管理 RPM 软件包。它基于 RPM(Red Hat Package Manager)进行包管理,并自动处理依赖关系,避免手动安装时出现缺少依赖包的问题。
YUM 语法格式: yum [options] [command] [package_name]
[options]:可选参数,如 -y 表示自动确认。
[command]:要执行的操作,如 install(安装)、remove(卸载)。
[package_name]:软件包名称,如 vim、nginx。
常见 YUM 命令:
yum install package 安装指定软件包
yum remove package 卸载指定软件包
yum update 更新所有已安装的软件包
yum update package 更新指定的软件包
yum list 列出可用的软件包
yum search keyword 根据关键字搜索软件包
yum info package 查看软件包的详细信息
yum clean all 清除 YUM 缓存
yum repolist 显示已启用的 YUM 源列表
yum provides filename 查找哪个软件包包含某个文件
示例:
yum install vim -y 安装软件 安装 vim,-y 选项表示自动确认,不需要手动输入 y,由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成
yum list | grep vim 通过grep筛选需要的包
Vim(Vi IMproved)是 Vi 编辑器的增强版,是 Linux 下最常用的文本编辑器之一,支持多种模式、语法高亮和插件扩展。
Vim 主要用三种模式:
插入模式 用于输入和编辑文本 在普通模式下按 i、a、o,insert 进入 按 Esc 退出
命令模式 用于保存、退出、查找、替换 插入模式Esc 退出
末行模式 文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。
2.2.2.1 打开和退出 Vim
vim 文件名 打开文件
命令模式下:
:q 退出(文件未修改时)
:q! 强制退出(不保存)
:w 保存文件
:wq 或 ZZ 保存并退出
:x 同 :wq,仅当文件修改时才写入
2.2.2.2 在文件中移动光标
命令模式下:
h 左移
l 右移
j 下移
k 上移
gg 跳到文件开头
G 跳到文件结尾
nG 跳到第 n 行
0 跳到行首
^ 跳到行首(非空字符)
$ 跳到行尾
2.2.2.3 插入和删除文本
命令模式下:
i 在光标前插入
I 在行首插入
a 在光标后插入
A 在行尾插入
o 在当前行下插入新行
O 在当前行上插入新行
x 删除当前字符
dd 删除当前行
D 删除光标到行尾
d$ 删除光标到行尾
d0 删除光标到行首
dgg 删除到文件开头
dG 删除到文件结尾
2.2.2.4 复制、粘贴和撤销
命令模式下:
yy 复制当前行
y$ 复制光标到行尾
y0 复制光标到行首
yw 复制一个单词
p 粘贴
u 撤销
Ctrl + r 反撤销
2.2.2.5 多窗口操作
:sp 文件名 水平分屏打开文件
:vsp 文件名 垂直分屏打开文件
Ctrl + w + w 切换窗口
Ctrl + w + h 切换到左侧窗口
Ctrl + w + l 切换到右侧窗口
Ctrl + w + j 切换到下方窗口
Ctrl + w + k 切换到上方窗口
:q 关闭当前窗口
2.2.2.6 Vim 配置
在目录 /etc/ 下面,有个名为vimrc的文件,可以自定义编辑习惯。例如
set number " 显示行号
set tabstop=4 " Tab 宽度设为 4
set autoindent " 自动缩进
set hlsearch " 高亮搜索
set ignorecase " 搜索时忽略大小写
set expandtab " 使用空格代替 Tab
1. 预处理(进行宏替换)
预处理阶段主要处理以 # 开头的预处理指令,如 #include、#define 等。预处理器执行以下操作:
宏替换:将所有的 #define 宏定义进行替换。
文件包含:处理 #include 指令,将被包含的头文件内容直接插入到源文件中。
条件编译:处理条件预编译指令,如 #if、#ifdef、#elif、#else、#endif 等。
删除注释:移除源代码中的所有注释。
预处理后的输出通常是一个扩展名为 .i 的文件
2. 编译(生成汇编)
在编译阶段,编译器将预处理后的代码转换为汇编代码。这一过程包括词法分析、语法分析、语义分析和优化等步骤。输出的汇编代码通常保存在扩展名为 .s 的文件中
3. 汇编(生成机器可识别代码)
汇编阶段将汇编代码转换为机器码,生成目标文件(通常扩展名为 .o)
4. 连接(生成可执行文件或库文件)
链接阶段将一个或多个目标文件与所需的库文件链接,生成可执行文件或库文件
GCC(GNU Compiler Collection)是一个功能强大的编译器套件,支持多种编程语言,包括 C 和 C++。其中,gcc 通常用于编译 C 语言程序,g++ 用于编译 C++ 程序。在使用这些编译器时,理解其语法和选项对于高效编译和调试至关重要。
语法:
gcc [选项] 文件名 [选项]
g++ [选项] 文件名 [选项]
常用编译选项:
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S 编译到汇编语言不进行汇编和链接
-o [输出文件名]:指定生成的可执行文件名称
-c:只编译源代码而不进行链接,生成目标文件(.o 文件)
-Wall:启用所有常见的警告,帮助发现潜在的问题。
-w 不生成任何警告信息
-g:生成包含调试信息的可执行文件,便于使用调试工具(如 gdb)进行调试
-O[level]:优化代码。level 可以是 0、1、2、3,级别越高,优化程度越强。O0表示没有优化,-O1为缺省值,-O3优化级别最高
-I[目录]:指定头文件搜索路径。
-L[目录]:指定库文件搜索路径。
-l[library]:链接指定的库文件。
-D[宏定义]:在编译时定义宏。
-static 此选项对生成的文件采用静态链接
示例:
编译源文件为目标文件:
gcc -c main.c -o main.o
gcc -c utils.c -o utils.o
链接目标文件生成可执行文件:
gcc main.o utils.o -o my_program
在软件开发过程中,编译器通常提供两种主要的编译模式:Debug(调试模式)和 Release(发布模式)。这两种模式在编译选项、性能优化、调试信息等方面存在显著差异,旨在满足开发和发布阶段的不同需求。
2.4.1.1 Debug 模式
Debug 模式主要用于开发和调试阶段,其特点包括:
调试信息:编译器在生成可执行文件时包含详细的调试信息,如符号表和源代码映射,方便开发者使用调试工具(如 GDB)进行断点设置、单步执行等操作。
性能优化:为了确保调试的一致性和可追溯性,编译器通常在 Debug 模式下禁用代码优化。这意味着代码将按照源代码的顺序执行,便于逐行调试,但可能导致程序运行速度较慢。
内存管理:Debug 模式下,编译器可能在内存分配时添加额外的调试信息。例如,申请内存时,可能会在内存块的前后添加特定的字节模式,以检测越界访问等错误。
断言和错误检查:通常,Debug 模式会启用断言和其他错误检查机制,以便在开发阶段及时捕获潜在的问题。
2.4.1.2 Release 模式
Release 模式用于软件的发布和部署,其特点包括:
性能优化:编译器在 Release 模式下会进行各种优化,如内联函数、循环展开、删除未使用的代码等,以提高程序的运行效率和响应速度。
调试信息:为了减小可执行文件的体积并保护源代码,Release 模式通常不包含或仅包含有限的调试信息。这使得反向工程变得更加困难,同时减少了文件大小。
内存管理:Release 模式下,编译器不会添加额外的调试信息,内存分配更为紧凑高效,但这也意味着缺乏对内存越界等问题的检测。
断言和错误检查:通常,Release 模式会禁用断言和某些错误检查,以避免运行时开销
默认情况下,gcc/g++编译器不会添加调试信息,要添加调试信息,需要在编译时使用 -g 选项。:默认情况下,编译器不进行代码优化,相当于使用 -O0 选项。
GDB(GNU Debugger)是 Linux 下功能强大的调试工具,广泛用于调试 C、C++、Go、Java、Objective-C、PHP 等多种编程语言。
2.4.2.1 GDB 的主要功能
启动程序:按照自定义要求运行程序。
设置断点:在指定位置暂停程序执行,便于检查状态。
检查状态:在程序暂停时,查看变量、内存等信息。
修改环境:动态改变程序的执行环境,以测试不同情境。
2.4.2.2 GDB 的主要功能
编译成可调试文件:gcc -g tst.c -o tst
启动 GDB:gdb tst
设置断点:(gdb) break 14
运行程序:(gdb) run
查看变量:(gdb) print result
单步执行:(gdb) next
继续运行:(gdb) continue
退出 GDB:(gdb) quit
2.4.2.3 GDB 的主要功能
常用 GDB 命令
break [行号/函数名]:设置断点。
run:运行程序。
print [变量名]:打印变量的值。
next:单步执行,不进入函数内部。
step:单步执行,进入函数内部。
continue:继续执行程序。
list:显示源代码。
info breakpoints:查看所有断点信息。
delete [断点号]:删除指定断点。
backtrace:显示函数调用栈。
quit:退出 GDB。
在大型软件项目中,源文件数量众多,手动编译和管理这些文件既繁琐又容易出错。make 工具和 Makefile 文件的引入,旨在通过定义一系列规则,自动化地确定哪些文件需要编译,以及如何编译,从而简化构建过程,提高开发效率。
make 是一个命令行工具,用于读取 Makefile 中的指令,按照其中定义的规则自动化地构建项目。它根据文件的依赖关系和更新时间,决定哪些部分需要重新编译,确保构建过程的高效性。Makefile 文件定义了构建目标、依赖关系和构建命令。
使用 make 和 Makefile,开发者可以:
自动化编译:避免手动输入繁琐的编译命令,提高效率。
管理依赖关系:确保只有在源文件发生变化时才重新编译,减少不必要的编译时间。
跨平台支持:通过在 Makefile 中定义不同平台的构建规则,实现跨平台构建。
Makefile文件可直接进行创建,在vim中进行编辑
Makefile 的基本结构:
目标: 依赖
.PHONY: clean
clean:
目标(Target):要生成的文件或执行的动作。
依赖(Dependencies):生成目标所需的文件或其他目标。
命令(Commands):为实现目标所执行的操作,通常是 shell 命令。需要注意的是,命令行前必须使用一个 TAB 键,而不是空格。
.PHONY 声明 clean 为伪目标,避免与同名文件冲突。clean 目标用于删除生成的可执行文件,保持工作目录的整洁。
使用方法:
构建项目: make
清理生成文件:make clean
Makefile 主要基于文件的时间戳(Timestamp) 来确定是否需要重新构建目标文件,基本流程如下:
解析 Makefile,读取所有规则。
检查依赖关系,判断哪些文件发生了变化。
确定需要执行的命令,并按顺序执行。
生成目标文件,保证项目是最新的。
如果一个目标文件的时间戳比其依赖的文件新,make 会认为它是最新的,不需要重新编译;否则,就会执行编译命令。
在 Linux 系统中,每个文件都有三个主要的时间戳:
atime(访问时间):文件最后被读取的时间(每当文件内容被读取时更新)。
mtime(修改时间):文件内容最后被修改的时间(每当文件的内容被修改时更新)。
ctime(状态更改时间):文件元数据(如权限、所有者等)最后被修改的时间(每当文件的权限、所有者、名字或其他元数据发生变化时)。
在 Makefile 中,make 工具判断目标文件是否需要重新构建,是基于文件的 修改时间戳
目标文件的时间戳:当 make 需要生成某个目标文件时,它首先查看目标文件的时间戳。目标文件的时间戳是它最后一次被更新的时间(例如,由于编译过程或手动操作)。
依赖文件的时间戳:make 会检查目标文件的所有依赖项(比如源代码文件 .c、头文件 .h 等)的时间戳。如果依赖文件的时间戳比目标文件的时间戳更新,make 就认为目标文件需要重新构建。
更新时间戳的条件:如果依赖文件比目标文件更新(即依赖文件的时间戳大于目标文件的时间戳),make 会执行相应的命令(如编译命令),生成新的目标文件,并更新目标文件的时间戳。
make 会递归检查依赖关系,确保所有目标都已更新。例如:
all: main
main: main.o utils.o
/* all 是 伪目标(phony target),它不是实际的文件,而是一个通用的构建目标。make 默认执行 Makefile 中的 第一个目标,这里 all 依赖 main,因此当你运行 make 时,它会先尝试构建 main。*/
gcc -o main main.o utils.o
/* main 是最终要生成的可执行文件,它依赖于 main.o 和 utils.o 这两个目标文件。make 会检查:main.o 是否比 main 目标新?utils.o 是否比 main 目标新?若其中任何一个 .o 文件比 main 旧,就会执行*/
main.o: main.c utils.h
gcc -c main.c
/*main.o 依赖 main.c 和 utils.h: 若 main.c 或 utils.h 发生了更改,则 main.o 需要重新生成。*/
utils.o: utils.c utils.h
gcc -c utils.c
/* utils.o 依赖 utils.c 和 utils.h:若 utils.c 或 utils.h 发生了更改,则 utils.o 需要重新生成。*/
执行顺序:
发现 all 依赖于 main,所以需要构建 main。
main 依赖 main.o 和 utils.o,构建main.o,utils.o
main.o依赖于main.c, utils.h,utils.o依赖于utils.c utils.h,先进行main.o、utils.o的编译。
注:-c 选项的作用是仅编译源代码,不进行链接,从而生成目标文件(.o 文件)。在 汇编阶段,编译器会将汇编代码转换为机器码,并生成目标文件(通常以 .o 作为扩展名)。这些目标文件是二进制可重定位文件,它们可以在 链接阶段 被进一步处理,与其他目标文件或库文件一同链接,最终生成可执行文件。
Git 是由 Linus Torvalds(Linux 之父) 开发的分布式版本控制系统。它允许多人协作管理代码,并支持版本回溯、分支管理等功能。Gitee/Github是一个基于 Git 的代码托管平台,根据项目面对国际还是国内选择Github或Gitee。
账号的注册可直接在官网完成。
常用操作
安装 git :yum install git
克隆远程仓库:git clone <仓库地址>
例如:git clone https://github.com/user/repo.git
添加文件到暂存区:git add <文件名> # 添加单个文件
git add 只是将文件放入 暂存区,还没有提交
提交改动到本地:git commit -m "提交说明"
commit 会把 暂存区 的内容提交到 本地仓库
同步到远端服务器上:git push
需要填入用户名密码. 同步成功后, 刷新 Github/Gitee 页面就能看到代码改动了
远端代码拉取到本地:git pull(当前分支) git pull [选项] [远程仓库] [分支名]
查看仓库状态:git status
查看提交记录:git log
Git 配置
# 设置用户名和邮箱(提交记录使用)
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
# 查看配置
git config --list