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

news2024/11/24 12:31:37

目录

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 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 -- .

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机基础知识复习8.13

cookie和session区别 cookie:是服务器发送到浏览器&#xff0c;并保存在浏览器端的一小块数据 浏览器下次访问服务时&#xff0c;会自动携带该块数据&#xff0c;将其发送给服务器 session:是javaEE标准&#xff0c;用于在服务端记录客户端信息 数据存放在服务端更加安全&a…

Leetcode JAVA刷刷站(14)最长公共前缀

一、题目概述 二、思路方向 在Java中&#xff0c;要编写一个函数来查找字符串数组中的最长公共前缀&#xff0c;我们可以遵循以下步骤&#xff1a; 处理边界条件&#xff1a;如果数组为空或长度为0&#xff0c;直接返回空字符串。初始化最长公共前缀&#xff1a;将数组的第一个…

[0CTF 2016]piapiapia1

打开题目 看到登录口 字符串绕过长度限制strlen($_POST[nickname]) > 10

Json Formatter工具

JSON 格式化工具的选择与使用 作为开发人员&#xff0c;我们经常需要查看和格式化 JSON 数据。虽然市面上有很多 JSON 工具可以满足这一需求&#xff0c;但在某些情况下&#xff0c;标准的 JSON 工具可能并不够用。 例如&#xff0c;处理一个 JavaScript 对象的格式&#xff…

【Qt】QWidget的windowTitle属性

QWidget的windowTitle属性 API说明 windowTitle() 获取到控件的窗⼝标题. setWindowTitle(const QString& title) 设置控件的窗⼝标题. 例子&#xff1a;设置窗口标题 当前windowTitle属性是从属于Qwidget的&#xff0c;Qwidget是一个广泛的定义&#xff0c;window…

Qt第十四章 模型视图

Model/View(模型/视图&#xff09;结构 文章目录 Model/View(模型/视图&#xff09;结构简介视图组件Model/View结构的一些概念项目控件组&#xff08;item Widgets&#xff09;模型/视图 如何使用项目视图组设置行的颜色交替变换拖拽设置编辑操作其他操作 选择模型自定义选择多…

打靶记录10——hacksudo---Thor

靶机&#xff1a; https://download.vulnhub.com/hacksudo/hacksudo---Thor.zip难度&#xff1a; 中 目标&#xff1a; 取得root权限flag 涉及攻击方法&#xff1a; 主机发现端口扫描Web目录爬取开源源码泄露默认账号密码SQL注入破壳漏洞GTFOBins提权 主机发现&#xff…

Windows的cmd命令行使用Linux类命令

Windows的cmd使用Linux类命令 去我的个人博客观看&#xff0c;观感更佳哦&#xff0c;&#x1f619;&#x1f619; 前言 我在使用Vscode编写C/C代码的时候&#xff0c;经常会用到Shell(你可以理解为命令行)&#xff0c;但是我不得不说Windows下Dos命令极其难用且拉跨&#x1f…

【应用层协议】自定义协议 {定义结构化数据;数据格式转换:序列化和反序列化,使用json库进行数据格式交换;分包和解包:为报文内容添加报头}

一、简单了解TCP协议&#xff08;引子&#xff09; 1.1 三次握手 三次握手就是客户端向服务端发起连接的过程 服务器初始化 调用socket&#xff0c;创建套接字文件 调用bind&#xff0c;将当前的文件描述符和ip/port绑定在一起&#xff1b;如果这个端口已经被其他进程占用了&…

整理 酷炫 Flutter 开源UI框架 按钮

flutter_percent_indicator Flutter 百分比指示器库 项目地址&#xff1a;https://github.com/diegoveloper/flutter_percent_indicator 项目Demo&#xff1a;https://download.csdn.net/download/qq_36040764/89631340

springboot整合doris(doris创建表)

Doris 的数据模型主要分为 3 类: 明细模型(Duplicate Key Model):允许指定的 Key 列重复;适用于必须保留所有原始数据记录的情况主键模型(Unique Key Model):每一行的 Key 值唯一;可确保给定的 Key 列不会存在重复行聚合模型(Aggregate Key Model):可根据 Key 列聚…

力扣每日一题 特殊数组 II 前缀和

Problem: 3152. 特殊数组 II &#x1f468;‍&#x1f3eb; 参考题解 Code class Solution {public boolean[] isArraySpecial(int[] nums, int[][] queries) {int[] s new int[nums.length];for (int i 1; i < nums.length; i) {s[i] s[i - 1] (nums[i - 1] % 2 num…

用R语言进行数据的特征缩放主要方法

下面内容摘录自《R 语言与数据科学的终极指南》专栏文章的部分内容&#xff0c;每篇文章都在 5000 字以上&#xff0c;质量平均分高达 94 分&#xff0c;看全文请点击下面链接&#xff1a; 4章11节&#xff1a;用R做数据重塑&#xff0c;数据的特征缩放和特征可视化-CSDN博客文…

第八季完美童模全球冠军·韩嘉滢 破浪扬帆写就传奇

在这个充满奇迹与梦想的舞台上&#xff0c;星光少女韩嘉滢以她独有的光芒&#xff0c;照亮了第八季完美童模的每一个角落。从亚特兰蒂斯的神秘海域到典故里的中国古韵&#xff0c;她以多变的风格与卓越的表现&#xff0c;征服了全球观众的心&#xff0c;最终荣登全球冠军的宝座…

K8S资源之Service

概念 将一组 Pods 公开为网络服务的抽象方法。 ClientIP 模型 集群内访问类型。 命令行 # 暴露端口 kubectl expose deployment my-dep-nginx --port8000 --target-port80Yml文件 apiVersion: v1 kind: Service metadata:labels:app: my-dep-nginxname: my-dep-nginx spe…

中小型企业可用的数据采集监控平台 为生产带来众多改变

中小型企业采用数据采集监控平台可以显著提升生产效率、优化生产流程、增强决策能力&#xff0c;并带来一系列积极的改变。 数据采集监控平台可提供从边缘感知设备到云端的数据采集、存储、分析、可视化等服务&#xff0c;实现生产工艺流程仿真、设备运行状态监控、数据报表、趋…

渗透测试实战-菠菜站渗透测试(Nacos反序列化漏洞利用)

免责声明&#xff1a;文章来源于真实渗透测试&#xff0c;已获得授权&#xff0c;且关键信息已经打码处理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本…

leetcode 103.二叉树的锯齿形层序遍历

1.题目要求: 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。2.做题思路:由题我们可以判断&#xff0c;树中每到偶数…

IV(电流-电压)测试和CV(电容-电压)测试

IV&#xff08;电流-电压&#xff09;测试和CV&#xff08;电容-电压&#xff09;测试是半导体参数表征中非常重要的两种测试方法。 一、IV测试&#xff08;电流-电压测试&#xff09; 1. 定义与目的 IV测试是测量半导体器件在不同电压下的电流响应&#xff0c;以评估其电学…

树莓派智能语音助手之ASR – SpeechRecognition+PocketSphinx

想要让树莓派成为智能语音助手&#xff0c;除了会“说”&#xff0c;也要会“听”。接下来&#xff0c;就要让它实现ASR&#xff08;语音识别&#xff09;功能了。 本来想用sherpa-onnx来实现离线语音识别的&#xff0c;可惜&#xff0c;我的树莓派系统太老了&#xff0c;折腾…