目录
Linux开发环境全解析:工具、编程与版本控制
1、软件包管理器YUM
查看可用的软件包
安装软件包
更新软件包
卸载软件包
查找软件包信息
清理缓存
检查可更新的软件包
显示软件包的依赖关系
2、Vim编辑器
vim的三种模式:命令模式、插入模式、底行模式
vim命令:
常用指令默写:
3、gcc/g++编译器
一键编译程序
预处理
生成汇编代码
编译为目标代码
链接生成可执行文件
生成调试信息
优化选项
抑制警告信息
生成所有警告信息
4、GDB调试器
1. 编译带调试信息的程序
2. 启动GDB
3. 设置断点
4. 运行程序
5. 检查程序状态
6. 单步执行
7. 修改和继续
8. 退出GDB
补充:常用GDB命令
5、Makefile自动化构建
Makefile的基本结构
示例Makefile
Makefile的关键概念
自动化构建的优势
6、使用Git进行版本控制
1. 使用刚学的yum安装Git
2. 初始化仓库
3. 添加文件到仓库
4. 提交更改
5. 查看状态
6. 查看提交历史
7. 创建分支
8. 切换分支
9. 合并分支
10. 解决合并冲突
11. 推送到远程仓库
12. 拉取远程更改
13. 标签管理
14. 撤销操作
Linux开发环境全解析:工具、编程与版本控制
Linux开发环境的强大之处在于其丰富的工具链和灵活的自动化能力。从YUM到Vim,从gcc到GDB,再到Makefile和Git,每一个工具都是构建高效开发流程的基石。希望本文能帮助读者快速掌握Linux开发环境,开启高效编程之旅。
1、软件包管理器YUM
YUM(Yellow dog Updater, Modified)是Linux发行版如Fedora, RedHat, CentOS等的常用包管理器。它允许用户方便地安装、更新和管理软件包。使用yum list
可以查看可安装的软件包,并通过yum install
和yum remove
命令来安装和卸载软件。常见的yum命令如下:
查看可用的软件包
使用yum list
命令可以列出所有可用的软件包。如果需要查找特定的软件包,可以结合grep
命令使用,例如:
yum list | grep vim
安装软件包
安装软件包可以通过yum install
命令完成,例如安装Vim编辑器:
sudo yum install vim
更新软件包
使用yum update
命令可以更新所有可更新的软件包:
sudo yum update
或者更新特定的软件包:
sudo yum update vim
卸载软件包
卸载软件包使用yum remove
命令,例如卸载Vim:
sudo yum remove vim
查找软件包信息
yum info
命令可以显示软件包的详细信息,例如:
yum info vim
清理缓存
YUM在本地会缓存软件包信息,使用yum clean
命令可以清理这些缓存,例如:
sudo yum clean all
检查可更新的软件包
yum check-update
命令可以列出所有有更新的软件包:
yum check-update
显示软件包的依赖关系
yum deplist
命令可以显示已安装软件包的依赖关系,例如:
yum deplist vim
2、Vim编辑器
Vim是Linux下强大的文本编辑器,支持多种模式,包括命令模式、插入模式和底行模式。Vim的基本操作涵盖了文本的插入、删除、复制、粘贴等。此外,Vim的配置可以通过.vimrc
文件进行个性化设置,增强编辑体验。
vim的三种模式:命令模式、插入模式、底行模式
- 命令模式(Normal Mode)
- 这是Vim启动后的默认模式。
- 在此模式下,你可以执行移动光标、查找文本、复制和粘贴文本块等命令,但不能直接输入文本。
- 可以通过按
Esc
键从其他模式返回到命令模式。
- 插入模式(Insert Mode)
- 在命令模式下按下
i
、a
、o
等插入命令键后,进入插入模式。 i
:在当前光标位置插入文本。a
:在当前光标后插入文本(即在光标所在字符之后)。o
或O
:在当前行的下方(o
)或上方(O
)新开一行并插入文本。- 在插入模式下,你可以输入文本,就像使用其他文本编辑器一样。
- 在命令模式下按下
- 底行模式(Last Line Mode 或 Command Line Mode)
- 通过在命令模式下按下
:
键进入底行模式。 - 此模式用于输入命令,如保存文件(
:w
)、退出Vim(:q
)、查找和替换文本等。 - 底行模式下的命令通常以
:
开头,然后是命令的具体参数。
- 通过在命令模式下按下
vim命令:
移动/跳转
「ctrl」+「b」:屏幕往“后”移动一页
「ctrl」+「f」:屏幕往“前”移动一页
[gg]:进入到文本开始
[shift+g]:进入文本末端
「ctrl」+「g」列出文本总行及当前位置
「#G」:例如,「15G」,表示移动光标至文章的第15行行首
删除文字
「x」:每按一次,删除光标所在位置的一个字符(向后删除)
「dd」:删除光标所在行
「nD」:删除n行
复制粘贴
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完
成复制与粘贴功能。
撤销
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。
「ctrl + r」: 撤销的恢复
退出vim程序
w:保存当前文件
q:退出vim程序
!:强制执行
可以组合使用
常用指令默写:
👋
移动/跳转
「ctrl」+「b」:屏幕往“后”移动一页
「ctrl」+「f」:屏幕往“前”移动一页
[gg]:进入到文本开始
[shift+g]:进入文本末端
「ctrl」+「g」列出文本总行及当前位置
「#G」:例如,「15G」,表示移动光标至文章的第15行行首
「yy」:复制光标所在行到缓冲区
「p」:将缓冲区内的字符贴到光标所在位置
「dd」:删除光标所在行
「u」:撤销
「ctrl + r」: 撤销的恢复
3、gcc/g++编译器
gcc/g++是Linux下的C/C++编译器,支持预处理、编译、汇编和链接四个阶段。通过不同的选项,如-E
、-S
、-c
和-o
,用户可以控制编译过程的每一步。此外,优化选项-O0
到-O3
允许用户根据需要调整代码的优化级别。
拓展:死代码删除是编译最优化技术,指的是移除根本执行不到的代码,或者对程序运行结果没有影响的代码,而并不是删除被注释的代码。
一键编译程序
要编译C程序,可以使用以下命令:
gcc hello.c -o hello
这里,hello.c
是源文件,-o hello
指定输出的可执行文件名为hello
。
编译C++程序时,使用g++
代替gcc
:
g++ hello.cpp -o hello
hello.cpp
是C++源文件。
预处理
使用-E
选项进行预处理,该选项只执行宏替换等预处理操作,不生成目标文件:
gcc -E hello.c -o hello.i
这将生成hello.i
预处理文件。
生成汇编代码
使用-S
选项生成汇编代码,不进行后续的编译和链接:
gcc -S hello.i -o hello.s
这将生成hello.s
汇编文件。
编译为目标代码
使用-c
选项编译源文件为目标代码(.o文件):
gcc -c hello.s -o hello.o
这将生成hello.o
目标文件。
链接生成可执行文件
链接目标文件生成可执行文件:
gcc hello.o -o hello
如果hello.o
依赖于其他库,可以在命令中指定库。
静态链接
使用-static
选项进行静态链接,生成的可执行文件将包含所有需要的库代码:
gcc -static hello.o -o hello
笔记:预处理 编译 汇编 链接 是编译的四个环节
对应的命令选项是ESc (键盘左上角)
生成的文件后缀是ISO (重装系统的磁盘文件后缀)
生成调试信息
使用-g
选项生成调试信息,这将帮助调试器如GDB更好地分析程序:
gcc -g hello.c -o hello
笔记:gcc编译器默认生成的可执行程序是release版本,无法调试。如果希望使用gdb调试器进行调试(后文有介绍),就需要使用-g生成debug版本文件。
优化选项
编译器提供不同的优化级别:
-O0
:没有优化。-O1
:启用基本优化(默认)。-O2
:进一步优化。-O3
:最高级别的优化。
gcc -O2 hello.c -o hello
抑制警告信息
使用-w
选项可以抑制所有警告信息:
gcc -w hello.c -o hello
生成所有警告信息
使用-Wall
选项生成所有警告信息:
gcc -Wall hello.c -o hello
4、GDB调试器
GDB是Linux下用于程序调试的工具,支持设置断点、单步执行、查看变量值等。使用-g
选项编译程序可以生成调试信息,使GDB能够更好地分析程序。
使用GDB调试程序的一般流程
1. 编译带调试信息的程序
使用-g
选项编译程序,确保生成的可执行文件包含调试信息。
// your_source_file.c
#include <stdio.h>
int main() {
int a = 5;
int b = a + 10; // 可能存在错误
printf("The result is: %d\n", b);
return 0;
}
编译命令:
gcc -g -o your_program your_source_file.c
2. 启动GDB
运行GDB并加载你的程序。
gdb ./your_program
3. 设置断点
在程序的main
函数入口处设置断点,或者在可能出错的代码行设置断点。
break main
或者
break your_source_file.c:4
(假设第4行是b = a + 10;
)
4. 运行程序
执行run
命令开始执行程序,直到遇到断点。
run
5. 检查程序状态
使用print
命令检查变量的值,使用info locals
查看当前函数的局部变量。
print a
print b
info locals
6. 单步执行
使用next
命令执行下一行代码,使用step
进入函数内部。
next // 执行下一行代码,不进入函数
step // 如果当前行是函数调用,进入该函数
7. 修改和继续
如果需要,可以修改变量的值,并使用continue
命令继续执行。
set var a=10
continue
8. 退出GDB
使用quit
命令退出GDB。
quit
这些步骤提供了一个基本的GDB调试流程。在实际使用中,你可能需要根据程序的具体情况调整断点的位置、检查的变量等。熟练掌握这些命令将有助于你更有效地调试程序。
补充:常用GDB命令
run
或r
:运行程序。break
或b
[line|function]:在指定的行号或函数处设置断点。continue
或c
:从断点处继续执行程序。next
或n
:执行下一行代码,如果当前行是一个函数调用,则执行该函数的下一行代码。step
或s
:进入当前行的函数内部,如果该行是一个函数调用。until
或u
[line]:继续执行程序,直到到达指定的行号。print
或p
[expression]:打印变量或表达式的值。list
或l
:显示源代码,可以指定行号或函数名。backtrace
或bt
:显示当前的调用栈。frame
或f
[frame number]:选择一个新的栈帧。up
:选择上一个栈帧(向调用者方向)。down
:选择下一个栈帧(向被调用者方向)。info locals
:显示当前栈帧的局部变量。info args
:显示当前栈帧的参数。info breakpoints
或info b
:列出所有断点。delete
[breakpoint number]:删除指定的断点。disable
[breakpoint number]:禁用指定的断点。enable
[breakpoint number]:启用指定的断点。set var
[variable = value]:在运行时修改变量的值。watch
[expression]:设置监视点,当表达式的值改变时程序会停下来。quit
或q
:退出GDB。
GDB是一个复杂而强大的工具,上述命令只是冰山一角。熟练使用GDB可以大大提高调试程序的效率。
5、Makefile自动化构建
Makefile定义了项目中文件的依赖关系和编译规则,通过make
命令可以自动编译整个项目。Makefile的好处在于一旦编写完成,只需一个命令即可完成项目的编译,极大提高了开发效率。
Makefile的基本结构
一个Makefile通常包含以下部分:
- 目标(Targets):通常是文件名,表示构建的结果。
- 依赖(Dependencies):目标文件依赖的源文件或其他目标。
- 规则(Rules):如何从依赖生成目标的命令序列。
示例Makefile
假设我们有一个简单的C程序,包含两个源文件:main.c
和 utils.c
,我们希望构建一个名为program
的可执行文件。
# 定义编译器
CC=gcc
# 定义编译选项
CFLAGS=-g -Wall
# 定义目标文件的前缀
OBJ = main.o utils.o
# 定义最终的可执行文件
TARGET = program
#————————————————————————————————————————————
# 上面的内容了解即可
# 默认目标
all: $(TARGET)
# 规则:如何构建可执行文件
$(TARGET): $(OBJ)
$(CC) $(CFLAGS) -o $@ $^
# 规则:如何生成目标文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 伪目标:清理编译生成的文件
.PHONY: clean
clean:
rm -f $(TARGET) $(OBJ)
Makefile的关键概念
- 自动变量:如
$@
代表目标文件,$<
代表第一个依赖文件,$^
代表所有依赖文件。 - 模式规则:如
%.o: %.c
是一个模式规则,它匹配所有从.c
到.o
的转换。 - 伪目标:如
.PHONY: clean
定义了一个伪目标,表示make clean
命令总是执行,不会检查是否存在名为clean
的文件。 - 隐含规则:make有一套默认的规则,例如从
.c
文件编译成.o
文件。
自动化构建的优势
- 减少重复工作:开发者只需编写一次构建规则。
- 提高效率:自动检测文件变化,只重新构建需要更新的部分。
- 易于维护:集中管理构建过程,易于理解和修改。
Makefile是大型项目中不可或缺的工具,它帮助开发者自动化和简化编译构建过程,节省时间并减少错误。
6、使用Git进行版本控制
Git是一个分布式版本控制系统,用于跟踪代码的更改。通过git add
、git commit
和git push
三个基本命令,用户可以将本地的代码更改提交到远程仓库。
[提示]为了避免刚入坑的同学,其实前期的git只需要三板斧就可以使用,其他命令后期再学习
第一条:添加更改
git add *
使用git add
命令将所有更改过的文件添加到暂存区:
第二条:保存更改
git commit -m "Commit message describing the changes"
使用git commit
命令将暂存区的文件提交到仓库
第三条:提交到远程仓库
git push
使用git push
将本地更改推送到远程仓库
详细命令:
1. 使用刚学的yum安装Git
在大多数Linux发行版中,可以通过包管理器安装Git:
sudo yum install git
2. 初始化仓库
在项目目录中运行以下命令来初始化一个新的Git仓库:
cd /path/to/your/project
git init
3. 添加文件到仓库
使用git add
命令将所有更改过的文件添加到暂存区:
git add *
4. 提交更改
使用git commit
命令将暂存区的文件提交到仓库:
git commit -am "Commit message describing the changes"
5. 查看状态
使用git status
查看仓库当前的状态:
git status
6. 查看提交历史
使用git log
查看提交历史:
git log
7. 创建分支
使用git branch
创建新分支:
git branch <branch_name>
8. 切换分支
使用git checkout
切换到指定分支:
git checkout <branch_name>
9. 合并分支
使用git merge
将一个分支的更改合并到当前分支:
git merge <branch_name>
10. 解决合并冲突
如果合并时出现冲突,Git会停止合并并让你手动解决。解决冲突后,再次提交更改:
git commit
11. 推送到远程仓库
首先,你需要添加一个远程仓库:
git remote add origin <repository_URL>
然后,使用git push
将本地更改推送到远程仓库:
git push -u origin <branch_name>
12. 拉取远程更改
使用git pull
从远程仓库拉取最新更改并合并到当前分支:
git pull origin <branch_name>
13. 标签管理
使用git tag
创建一个新的标签:
git tag <tag_name>
推送标签到远程仓库:
git push origin <tag_name>
14. 撤销操作
- 回滚到上一个提交:
git reset --hard HEAD^
- 撤销工作目录中的所有更改:
git checkout -- .