Linux | Linux开发工具链全攻略:yum、vim、gcc/g++、GDB、Makefile与git版本控制

目录

Linux开发环境全解析:工具、编程与版本控制

1、软件包管理器YUM

查看可用的软件包

安装软件包

更新软件包

卸载软件包

查找软件包信息

清理缓存

检查可更新的软件包

显示软件包的依赖关系

2、Vim编辑器

vim的三种模式:命令模式、插入模式、底行模式

vim命令:

常用指令默写:

3、gcc/g++编译器

一键编译程序

预处理

生成汇编代码

编译为目标代码

链接生成可执行文件

生成调试信息

优化选项

抑制警告信息

生成所有警告信息

4、GDB调试器

[1. 编译带调试信息的程序](#1. 编译带调试信息的程序)

[2. 启动GDB](#2. 启动GDB)

[3. 设置断点](#3. 设置断点)

[4. 运行程序](#4. 运行程序)

[5. 检查程序状态](#5. 检查程序状态)

[6. 单步执行](#6. 单步执行)

[7. 修改和继续](#7. 修改和继续)

[8. 退出GDB](#8. 退出GDB)

补充:常用GDB命令

5、Makefile自动化构建

Makefile的基本结构

示例Makefile

Makefile的关键概念

自动化构建的优势

6、使用Git进行版本控制

[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 installyum 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的三种模式:命令模式、插入模式、底行模式
  1. 命令模式(Normal Mode)
    • 这是Vim启动后的默认模式。
    • 在此模式下,你可以执行移动光标、查找文本、复制和粘贴文本块等命令,但不能直接输入文本。
    • 可以通过按Esc键从其他模式返回到命令模式。
  2. 插入模式(Insert Mode)
    • 在命令模式下按下iao等插入命令键后,进入插入模式。
    • i:在当前光标位置插入文本。
    • a:在当前光标后插入文本(即在光标所在字符之后)。
    • oO:在当前行的下方(o)或上方(O)新开一行并插入文本。
    • 在插入模式下,你可以输入文本,就像使用其他文本编辑器一样。
  3. 底行模式(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命令
  • runr:运行程序。
  • breakb [line|function]:在指定的行号或函数处设置断点。
  • continuec:从断点处继续执行程序。
  • nextn:执行下一行代码,如果当前行是一个函数调用,则执行该函数的下一行代码。
  • steps:进入当前行的函数内部,如果该行是一个函数调用。
  • untilu [line]:继续执行程序,直到到达指定的行号。
  • printp [expression]:打印变量或表达式的值。
  • listl:显示源代码,可以指定行号或函数名。
  • backtracebt:显示当前的调用栈。
  • framef [frame number]:选择一个新的栈帧。
  • up:选择上一个栈帧(向调用者方向)。
  • down:选择下一个栈帧(向被调用者方向)。
  • info locals:显示当前栈帧的局部变量。
  • info args:显示当前栈帧的参数。
  • info breakpointsinfo b:列出所有断点。
  • delete [breakpoint number]:删除指定的断点。
  • disable [breakpoint number]:禁用指定的断点。
  • enable [breakpoint number]:启用指定的断点。
  • set var [variable = value]:在运行时修改变量的值。
  • watch [expression]:设置监视点,当表达式的值改变时程序会停下来。
  • quitq:退出GDB。

GDB是一个复杂而强大的工具,上述命令只是冰山一角。熟练使用GDB可以大大提高调试程序的效率。

5、Makefile自动化构建

Makefile定义了项目中文件的依赖关系和编译规则,通过make命令可以自动编译整个项目。Makefile的好处在于一旦编写完成,只需一个命令即可完成项目的编译,极大提高了开发效率。

Makefile的基本结构

一个Makefile通常包含以下部分:

  • 目标(Targets):通常是文件名,表示构建的结果。
  • 依赖(Dependencies):目标文件依赖的源文件或其他目标。
  • 规则(Rules):如何从依赖生成目标的命令序列。
示例Makefile

假设我们有一个简单的C程序,包含两个源文件:main.cutils.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 addgit commitgit 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 -- .

相关推荐
Ajiang2824735304几秒前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
内核程序员kevin2 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
yyycqupt4 小时前
git使用(一)
git
‘’林花谢了春红‘’5 小时前
C++ list (链表)容器
c++·链表·list
机器视觉知识推荐、就业指导6 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
朝九晚五ฺ6 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream7 小时前
Linux的桌面
linux
xiaozhiwise7 小时前
Makefile 之 自动化变量
linux
Kkooe8 小时前
GitLab|数据迁移
运维·服务器·git