目录
[1. 编译带调试信息的程序](#1. 编译带调试信息的程序)
[2. 启动GDB](#2. 启动GDB)
[3. 设置断点](#3. 设置断点)
[4. 运行程序](#4. 运行程序)
[5. 检查程序状态](#5. 检查程序状态)
[6. 单步执行](#6. 单步执行)
[7. 修改和继续](#7. 修改和继续)
[8. 退出GDB](#8. 退出GDB)
[1. 使用刚学的yum安装Git](#1. 使用刚学的yum安装Git)
[2. 初始化仓库](#2. 初始化仓库)
[3. 添加文件到仓库](#3. 添加文件到仓库)
[4. 提交更改](#4. 提交更改)
[5. 查看状态](#5. 查看状态)
[6. 查看提交历史](#6. 查看提交历史)
[7. 创建分支](#7. 创建分支)
[8. 切换分支](#8. 切换分支)
[9. 合并分支](#9. 合并分支)
[10. 解决合并冲突](#10. 解决合并冲突)
[11. 推送到远程仓库](#11. 推送到远程仓库)
[12. 拉取远程更改](#12. 拉取远程更改)
[13. 标签管理](#13. 标签管理)
[14. 撤销操作](#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 -- .