Linux 环境基础开发工具详解

news2024/11/29 10:34:44

引言

Linux 环境下的开发工具非常丰富,是程序员和开发人员进行高效开发的必备基础。本篇文章将深入介绍 Linux 环境下的基础开发工具,包括软件包管理器、文本编辑器、编译器、调试工具、自动化构建工具以及版本管理工具等。通过本文的学习,读者将掌握在 Linux 系统中如何配置开发环境、编写代码、编译、调试以及进行版本控制等关键技能。

一、Linux 软件包管理器 yum

1.1 什么是软件包?

在 Linux 中,软件包是经过预编译、打包的应用程序或工具,它类似于 Windows 系统中的安装程序。软件包可以通过包管理器进行管理,简化软件的安装、更新和卸载过程。常见的软件包后缀包括 .rpm.deb 等。

1.2 yum 工具简介

yum(Yellow dog Updater, Modified)是 Linux 下非常常用的包管理器,主要应用于 Fedora、RedHat、CentOS 等发行版。它相当于 Linux 系统的"应用商店",用户可以通过 yum 工具轻松地获取和安装各种预编译好的软件包。

yum 的工作原理基于 rpm 包管理系统,但提供了更高级的依赖管理和自动化功能。它可以自动解决软件包的依赖关系,确保安装的软件能够正常工作,而无需手动处理依赖项。

1.3 软件包的安装与卸载

  • 安装软件包

    sudo yum install 软件包名

    例如,安装 gcc 编译器:

    sudo yum install gcc

    yum 会自动找到相关的依赖包并完成安装。

  • 更新软件包: 更新系统中所有软件包到最新版本:

    sudo yum update

    也可以单独更新某个软件包:

    sudo yum update 软件包名
  • 卸载软件包

    sudo yum remove 软件包名
  • 查找软件包: 使用 yum search 可以查找符合条件的软件包,例如查找与 vim 相关的软件包:

    yum search vim
  • 列出已安装的软件包: 使用 yum list installed 可以列出系统中已安装的软件包。

二、Linux 编辑器 - vim 使用

2.1 vim 的基本概念

vimvi 编辑器的增强版,不仅兼容 vi 的所有命令,还增加了语法高亮、插件支持等特性。vim 是一个多模式编辑器,主要有以下三种模式:

  • 命令模式(Normal mode):用于控制光标移动、删除、复制文本等。

  • 插入模式(Insert mode):用于编辑文本,按 i 进入插入模式,按 ESC 退出。

  • 底行模式(Last line mode):用于保存、退出、查找等操作,按 : 进入底行模式。

除了这三种主要模式,vim 还有可视化模式(Visual mode),用于文本块的选择与操作。

2.2 vim 的基本操作

  • 进入 vim

    vim 文件名

    进入后默认处于命令模式,需要按 ia 进入插入模式进行文本编辑。

  • 保存与退出

    • 保存文件::w

    • 退出 vim::q

    • 保存并退出::wq

    • 不保存强制退出::q!

  • 常用命令

    • 删除字符:按 x 删除光标所在的字符。

    • 复制与粘贴:按 yy 复制当前行,按 p 粘贴。

    • 撤销操作:按 u 撤销上一次操作。

    • 重做操作:按 Ctrl + r 重做已撤销的操作。

    • 查找字符串:按 /字符串 进行查找,按 n 查找下一个匹配项。

  • 文本操作

    • 删除行:按 dd 删除光标所在的整行。

    • 复制行:按 yy 复制光标所在行。

    • 粘贴行:按 p 粘贴复制的内容。

    • 替换字符:按 r 替换光标所在的字符。

2.3 vim 的配置

vim 的配置文件通常位于 /etc/vimrc(系统全局配置)和用户目录下的 ~/.vimrc(用户私有配置)。常用的配置选项包括:

  • 语法高亮syntax on

  • 显示行号set nu

  • 设置缩进set shiftwidth=4

  • 启用自动缩进set autoindent

  • 设置搜索时忽略大小写set ignorecase

vim 支持通过插件扩展功能,如文件浏览器插件、语法高亮插件等,可以极大地提高开发效率。常用的插件包括 NERDTree(文件树浏览器)、TagList(代码结构浏览)等。

三、Linux 编译器 - gcc/g++ 使用

3.1 gcc 编译器简介

gcc 是 GNU Compiler Collection 的缩写,是 Linux 系统中常用的 C/C++ 编译器。编译器将源代码转换为计算机可以执行的二进制代码,整个编译过程包括预处理、编译、汇编和链接四个步骤。

gcc 具有强大的功能,可以通过各种编译选项实现不同的优化和功能,如生成调试信息、启用优化等。

3.2 编译过程详解

  1. 预处理(宏替换):将宏定义展开,处理 #include 文件等。使用 -E 选项查看预处理结果:

    gcc -E hello.c -o hello.i
  2. 编译(生成汇编代码):将预处理后的代码转换为汇编代码,使用 -S 选项:

    gcc -S hello.i -o hello.s
  3. 汇编(生成机器码):将汇编代码转为目标文件,使用 -c 选项:

    gcc -c hello.s -o hello.o
  4. 链接(生成可执行文件):将目标文件链接为可执行文件:

    gcc hello.o -o hello

在实际使用中,我们通常将这些步骤合并为一个命令来直接生成可执行文件:

gcc hello.c -o hello

3.3 静态库与动态库

函数库分为静态库(.a)和动态库(.so)。

  • 静态库:在编译时将库文件的代码嵌入到可执行文件中,生成的文件较大,但独立性强。

  • 动态库:在运行时链接,生成的可执行文件较小,需要依赖系统中的动态库。

3.3.1 静态库的使用

创建静态库:

gcc -c libexample.c -o libexample.o
ar rcs libexample.a libexample.o

在编译程序时使用静态库:

gcc main.c -L. -lexample -o main
3.3.2 动态库的使用

创建动态库:

gcc -fPIC -c libexample.c -o libexample.o
gcc -shared -o libexample.so libexample.o

在编译程序时使用动态库:

gcc main.c -L. -lexample -o main

运行时指定库的路径:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

四、Linux 调试器 - gdb 使用

4.1 gdb 调试器简介

gdb 是 GNU 调试器,用于调试 C/C++ 程序,可以单步执行代码、设置断点、查看变量值等。为了使用 gdb 进行调试,编译时需要加上 -g 选项,生成包含调试信息的可执行文件。

使用 gdb 可以有效地排查代码中的问题,尤其是对于大型项目,通过设置断点和逐行调试,能够发现代码中的逻辑错误和异常。

4.2 常用调试命令

  • 启动调试:启动 gdb 并加载可执行文件:

    gdb ./hello
  • 运行程序runr,开始执行程序。

  • 设置断点

    • 在某行设置断点:break 行号b 行号

    • 在某个函数设置断点:break 函数名b 函数名

  • 单步执行

    • nextn:单步执行,不进入函数内部。

    • steps:单步执行,进入函数内部。

  • 查看变量值print 变量名p 变量名

  • 继续运行continuec,继续执行程序直到下一个断点。

  • 查看调用栈backtracebt

  • 退出 gdbquit

4.3 调试实例

gcc -g hello.c -o hello
gdb hello
(gdb) break main
(gdb) run
(gdb) next
(gdb) print some_variable
(gdb) backtrace
(gdb) quit

通过这些命令,开发者可以有效地排查代码中的问题,尤其是在程序崩溃时,通过查看调用栈可以快速定位问题所在。

五、Linux 项目自动化构建工具 - Makefile

5.1 Makefile 的作用

Makefile 是 Linux 项目中常用的自动化构建工具。它定义了编译规则,可以指定文件的编译顺序、依赖关系等。make 工具根据 Makefile 中的规则自动完成编译工作,大大提高了项目的构建效率。

在大型项目中,源码文件往往分布在多个目录下,手动编译这些文件既繁琐又容易出错。通过编写 Makefile,可以自动化完成整个项目的编译、链接等工作。

5.2 Makefile 基本语法

Makefile 由一系列规则组成,每条规则包括目标文件、依赖文件和生成命令。

hello: hello.o
	gcc hello.o -o hello

hello.o: hello.c
	gcc -c hello.c -o hello.o

在这个示例中,hello 依赖于 hello.ohello.o 依赖于 hello.cmake 工具会根据依赖关系自动生成最终的可执行文件。

5.3 Makefile 高级用法

  • 变量定义

    CC = gcc
    CFLAGS = -g -Wall
    
    hello: hello.o
    	$(CC) $(CFLAGS) hello.o -o hello

    通过定义变量,可以简化 Makefile 的编写,并且方便后续的维护和修改。

  • 自动变量: Makefile 提供了一些自动变量,例如:

    • $@:表示目标文件。

    • $<:表示第一个依赖文件。

    • $^:表示所有的依赖文件。

    hello: hello.o
    	$(CC) -o $@ $^

5.4 清理项目

在 Makefile 中,可以使用 .PHONY 定义伪目标来清理项目:

.PHONY: clean
clean:
	rm -f hello.o hello

通过执行 make clean,可以删除中间文件,保持项目目录整洁。

六、Linux 第一个小程序 - 进度条

6.1 进度条代码示例

在 Linux 系统中,可以使用 C 语言编写一个简单的进度条程序来演示编程的基本技巧:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main() {
    int i = 0;
    char bar[102];
    memset(bar, 0, sizeof(bar));
    const char *lable = "|/-\\";
    while (i <= 100) {
        printf("[%-100s][%d%%][%c]\r", bar, i, lable[i % 4]);
        fflush(stdout);
        bar[i++] = '#';
        usleep(10000);
    }
    printf("\n");
    return 0;
}

在这个程序中,进度条通过字符 # 来表示进度,usleep() 用于控制每次更新之间的延迟,\r 用于将光标移动到行首,达到刷新效果。

6.2 进度条程序的实现原理

进度条程序的核心是利用了控制台的 \r(回车符)来将光标移动到行首,并用 fflush(stdout) 强制刷新输出缓冲区。这样每次循环都能够覆盖之前的输出,实现类似动态刷新的效果。

通过使用 usleep(10000),可以控制进度条的速度,使其更新更为平滑。该程序的实现非常简单,却展示了控制台应用的一些基本技巧。

七、使用 git 进行版本控制

7.1 安装 git

在 Linux 系统中,可以通过以下命令安装 git

yum install git

git 是一个分布式版本控制系统,可以帮助开发者管理源代码、跟踪更改、协作开发。安装完成后,可以使用 git --version 检查安装是否成功。

7.2 Git 基本操作

  • 初始化仓库: 在项目目录下初始化一个新的 Git 仓库:

    git init

    这将创建一个名为 .git 的隐藏目录,用于存储版本控制信息。

  • 将文件添加到暂存区

    git add 文件名

    也可以使用 git add . 将所有更改添加到暂存区。

  • 提交更改到本地仓库

    git commit -m "提交说明"

    提交时应写明有意义的提交信息,以便日后追溯。

  • 查看仓库状态: 使用 git status 查看当前仓库的状态,包括哪些文件有更改、哪些文件在暂存区等。

  • 查看提交历史: 使用 git log 查看提交历史。

7.3 在 GitHub 上创建项目

  1. 注册账号并创建仓库:在 GitHub 上注册账号并创建一个新的仓库。

  2. 克隆仓库到本地

    git clone 仓库地址

    这将把远程仓库的代码克隆到本地,方便本地开发。

  3. 同步本地代码到远程仓库: 在本地进行修改后,使用以下命令将更改同步到 GitHub:

    git push origin main

7.4 分支管理

  • 创建分支

    git branch 分支名
  • 切换分支

    git checkout 分支名
  • 合并分支:将某个分支合并到当前分支:

    git merge 分支名
  • 删除分支

    git branch -d 分支名

分支管理是 Git 的重要特性,可以方便地进行多人协作开发,每个开发者可以在自己的分支上工作,最后再将更改合并到主分支上。

八、总结

本文详细介绍了 Linux 环境下进行开发的基础工具和方法,包括 yum 软件包管理器、vim 编辑器、gcc 编译器、gdb 调试器、Makefile 自动化构建工具以及 git 版本控制工具。通过学习这些内容,读者可以在 Linux 系统中独立搭建开发环境,编写、编译和调试代码,并进行版本管理。

这些工具是每个 Linux 开发者的必备基础,熟练掌握它们将极大地提高开发效率和代码质量。希望本文对大家有所帮助,激发大家对 Linux 开发的兴趣。如果你有任何问题或想要深入了解某个部分,欢迎在评论区留言,我们一起交流学习。

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

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

相关文章

webrtc 3A移植以及实时处理

文章目录 前言一、交叉编译1.Pulse Audio webrtc-audio-processing2.交叉编译 二、基于alsa进行实时3A处理1.demo源码2.注意项3.效果展示 总结 前言 由于工作需要&#xff0c;硬件3A中的AEC效果实在太差&#xff0c;后面使用SpeexDSP的软3A&#xff0c;效果依旧不是很好&#…

Python学习第十天--处理CSV文件和JSON数据

CSV&#xff1a;简化的电子表格&#xff0c;被保存为纯文本文件 JSON&#xff1a;是一种数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成&#xff0c;以JavaScript源代码的形式将信息保存在纯文本文件中 一、csv模块 CSV文件中的每行代表电…

Layui表格的分页下拉框新增“全部”选项

1、首先需要从后端接口获取表格的全部数据长度&#xff0c;这里以100为例。 2、根据请求到的数据进行表格的渲染。示例代码&#xff1a; let pageSize 5 let pageNo 1 let count 100 table.render({elem: XXX,done: function(res, curr, count){pageNo curr; // 将当前选…

CBK7运营安全

1 运营部门的角色 ​ prudent man、due care&#xff08;按要求执行&#xff09;VS due diligence&#xff08;承担管理者责任&#xff09; ​ 应尽关注&#xff1a;执行了负责任的动作降低了风险。 ​ 应尽职责&#xff1a;采取了所有必要的安全步骤以了解公司或个人的实际风…

AIGC引领金融大模型革命:未来已来

文章目录 金融大模型的应用场景1. **金融风险管理**2. **量化交易**3. **个性化投资建议**4. **金融欺诈检测和预防**5. **智能客户服务** 金融大模型开发面临的挑战应对策略《金融大模型开发基础与实践》亮点内容简介作者简介获取方式 在AIGC&#xff08;Artificial Intellige…

Linux操作系统2-进程控制3(进程替换,exec相关函数和系统调用)

上篇文章&#xff1a;Linux操作系统2-进程控制2(进程等待&#xff0c;waitpid系统调用&#xff0c;阻塞与非阻塞等待)-CSDN博客 本篇代码Gitee仓库&#xff1a;Linux操作系统-进程的程序替换学习 d0f7bb4 橘子真甜/linux学习 - Gitee.com 本篇重点&#xff1a;进程替换 目录 …

Java函数式编程+Lambda表达式

文章目录 函数式编程介绍纯函数Lambda表达式基础Lambda的引入传统方法1. 顶层类2. 内部类3. 匿名类 Lambda 函数式接口&#xff08;Functional Interface&#xff09;1. **函数式接口的定义**示例&#xff1a; 2. **函数式接口与Lambda表达式的关系**关联逻辑&#xff1a;示例&…

DI依赖注入详解

DI依赖注入 声明了一个成员变量&#xff08;对象&#xff09;之后&#xff0c;在该对象上面加上注解AutoWired注解&#xff0c;那么在程序运行时&#xff0c;该对象自动在IOC容器中寻找对应的bean对象&#xff0c;并且将其赋值给成员变量&#xff0c;完成依赖注入。 AutoWire…

自动化运维(k8s)之微服务信息自动抓取:namespaceName、deploymentName等全解析

前言&#xff1a;公司云原生k8s二开工程师发了一串通用性命令用来查询以下数值&#xff0c;我想着能不能将这命令写成一个自动化脚本。 起初设计的 版本一&#xff1a;开头加一条环境变量&#xff0c;执行脚本后&#xff0c;提示输入&#xff1a;需要查询的命名空间&#xff0c…

[Python/网络安全] Git漏洞之Githack工具基本安装及使用详析

前言 本文仅分享Githack工具基本安装及使用相关知识&#xff0c;不承担任何法律责任。 Git是一个非常流行的开源分布式版本控制系统&#xff0c;它被广泛用于协同开发和代码管理。许多网站和应用程序都使用Git作为其代码管理系统&#xff0c;并将其部署到生产环境中以维护其代…

解决水库安全监测难题 长期无外接电源 低功耗设备智能化监测系统

解决水库安全监测难题 长期无外接电源 低功耗设备智能化监测系统 国内某水库安全监测项目需要监测点分散&#xff0c;且无外接供电。项目年限为4年&#xff0c;不允许使用太阳能电板。因此&#xff0c;我们需要设备具备低功耗且内置电池的功能。为了满足客户的要求&#xff0c;…

蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、组合数问题:::非常典型的必刷例题!!!)

下将以括号序列、组合数问题超级吧难的题为例子讲解动态规划 别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! ! &#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 动态规划 一、数字三角形 【问题描述】 上图给出了…

AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复

在Altium Designer软件中&#xff0c;切换三维视图以及恢复二维视图的操作相对简单。以下是具体的步骤&#xff1a; 切换三维视图 在PCB设计界面中&#xff0c;2D切换3D&#xff0c;快捷键按住数字键盘中的“3”即可切换&#xff1b; 快捷键ctrlf&#xff08;或者vb快捷键也…

学习threejs,使用CubeCamera相机创建反光效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️CubeCamera 立方体相机 二、…

长时间无事可做是个危险信号

小马加入的是技术开发部&#xff0c;专注于Java开发。团队里有一位姓隋的女同事&#xff0c;是唯一的web前端工程师&#xff0c;负责页面开发工作&#xff0c;比小马早两个月入职。公司的项目多以定制化OA系统为主&#xff0c;后端任务繁重&#xff0c;前端工作相对较少。在这样…

Llama模型分布式训练(微调)

1 常见大模型 1.1 参数量对照表 模型参数量发布时间训练的显存需求VGG-19143.68M2014~5 GB&#xff08;单 224x224 图像&#xff0c;batch_size32&#xff09;ResNet-15260.19M2015~7 GB&#xff08;单 224x224 图像&#xff0c;batch_size32&#xff09;GPT-2 117M117M2019~…

Linux 子进程 -- fork函数

子进程 什么是子进程? 子进程指的是由一个已经存在的进程&#xff08;称为父进程或父进程&#xff09;创建的进程. 如: OS (操作系统) 就可以当作是一个进程, 用来管理软硬件资源, 当我点击浏览器, 想让浏览器运行起来时, 实际上是由 OS 接收指令, 然后 OS 帮我们将浏览器运行…

DataLoade类与list ,iterator ,yield的用法

1 问题 探索DataLoader的属性&#xff0c;方法 Vscode中图标含意 list 与 iterator 的区别&#xff0c;尤其yield的用法 2 方法 知乎搜索DataLoader的属性&#xff0c;方法 pytorch基础的dataloader类是 from torch.utils.data.dataloader import Dataloader 其主要的参数如下&…

C++入门——“C++11-lambda”

引入 C11支持lambda表达式&#xff0c;lambda是一个匿名函数对象&#xff0c;它允许在函数体中直接定义。 一、初识lambda lambda的结构是&#xff1a;[ ] () -> 返回值类型 { }。从左到右依次是&#xff1a;捕捉列表 函数参数 -> 返回值类型 函数体。 以下是一段用lam…

【Linux网络编程】第二弹---Socket编程入门指南:从IP、端口号到传输层协议及编程接口全解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Socket 编程预备 1.1、理解源 IP 和目的 IP 1.2、认识端口号 1.2.1、端口号范围划分 1.2.2、理解 &q…