linux中基础开发工具的使用

本文介绍了Linux中的包管理器yum的使用,包括安装、删除软件包。接着详细讲述了vim编辑器的四种模式和常用操作。接着讨论了gcc的编译过程,包括预处理、编译、汇编和链接,并区分了静态库与动态库。此外,还提到了gdb调试器的使用和Makefile自动化构建工具。最后,通过一个简单的进度条小程序展示了缓冲区和sleep函数的运用。
摘要由CSDN通过智能技术生成

1.linux中的软件包管理器

1.1什么是软件包

在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.yum(Yellow dog Updater, Modifified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上。

1.2具体使用

当然在开始介绍前我先提醒一下,如果想要使用yum指令的话必须要保持网络通畅,且安装和删除都在在root或者使用sudo来执行

查看软件包:

yum list | grep lrzsz

安装软件:

sudo yum install lrzsz

删除软件:

sudo yum remove lrzsz

2.vim文本编辑器

2.1正常开发流程

在我们正式开始讲解之前我们先回顾一下整个开发的这样一个流程

编写代码

编译代码

调试代码

发布运行代码

代码关系的维护

而我们的vi/vim干的就是编写代码的工作,定位上来说和记事本没什么区别,通常情况下,许多Linux发行版都会默认安装Vim,因为它是一个非常流行和功能强大的编辑器。(vim是vi的升级版)

2.2vim的四种模式

普通/命令模式:默认下的模式,退出按 shift : q (回车)

插入模式:用户可以像在其他编辑器中一样输入文本,在命令模式下输入i/a/o 可以进入此模式,按esc可回到命令模式

底行模式:shift : 进入此模式 ,输入w保持 , q退出 ,!强制 (也只能在命令模式下进入)

可视模式:在可视模式下,用户可以选择文本进行操作,例如复制、删除、替换等。可视模式可以通过按下 v 进入。(也只能在普通模式下)

2.3一些常见光标的使用(在命令模式下使用)
具体功能快捷键
让光标跳到当前行的行首shift ^
让光标跳到当前行的行尾shift $
跳转到所有代码的起始行gg
跳转到所有代码的结束行shift g
跳转到指定行n(具体行数) shift g (都要按住不放手)
w/b单词为单位进行前/后移动
2.4文本操作(也是在命令模式下使用)
具体功能快捷键
复制当前行yy
复制n行(包括当前行)nyy
撤销y
粘贴p/np(重复粘贴n次)
删除光标所在行dd
剪切功能dd删除之后直接p或者np
快速大小写切换shift ~ (光标指向的小写变成大写)
删除光标之后的一个字符/n个字符x/nx
从光标的右向左删X
替换一个光标所在的字符/或者n个字符r/nr 然后输入你想替换的内容
进入替换模式进入:shift r 退出:esc
撤销最近的撤销ctrl r
2.5底行命令的一些操作
具体功能快捷键
调出行号set nu
取消行号set nonu
分屏vs 所创分配文件名 (q:退出当前窗口)
光标跳转ctrl w
不退出vim照样编译程序!./可执行文件名
不退出vim查手册!man
2.6一些注意事项

vim配置在用户自己的配置文件中,只会影响自己的操作,root管理员有自己的vim配置,至于如何配置不同版本会有不同方法,这些内容在网上都有这里就不一一赘述了。

3.gcc编译

3.1实战使用

当我在一个文件当中写完代码,然后输入 gcc文件名 ,接着当前的目录下会生成一个a.out已经编译完成的文件,接着./a.out运行即可。

例子(这里我已经写好的文件名为test6.c):

在这里插入图片描述

另一种生成可执行文件的法子:

gcc mytest.c -o mytest / gcc -o mytest mytest.c (mytest.c为已经写好的文件,mytest为编译好的可执行程序)
在这里插入图片描述

3.2程序编译的具体过程

首先在我们讲解具体操作时,我们先来复习一下程序编译的4个阶段:

  • 预处理(进行宏替换)

    预处理功能主要包括宏定义,文件包含,条件编译,去注释等。

    预处理指令是以#号开头的代码行。

    实例: gcc –E hello.c –o hello.i

    选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。

    选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

  • 编译(生成汇编)

    在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查

    无误后,gcc 把代码翻译成汇编语言。

    用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

    实例: gcc –S hello.i –o hello.s

  • 汇编(生成机器可识别代码)

    汇编阶段是把编译阶段生成的“.s”文件转成目标文件

    读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了

    实例: gcc –c hello.s –o hello.o

  • 链接(生成可执行文件的库文件)

    在成功编译之后,就进入了链接阶段。

    实例: gcc hello.o –o hello

    而链接过程又涉及一个很重要的概念:函数库

    我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而

    没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

    其实系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到

    系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函

    数“printf”了,而这也就是链接的作用。

3.3动静态库

我们的库分为两者:

  1. 静态库(文件后缀名为.a)
  2. 动态库(文件后缀名为.so)

静态链接库在编译时被链接到目标程序中,整个库的内容都被复制到目标程序中,使得目标程序可以独立运行,不需要依赖于其他的库文件。由于静态链接库的内容都被复制到目标程序中,因此目标程序的体积会变大。同时,由于每个目标程序都复制了一份库文件,因此在磁盘空间和内存使用方面可能会造成浪费。

动态链接库则是在运行时才被加载到内存中,并被多个程序同时共享使用,这样就能够避免静态链接库造成的浪费。动态链接库在磁盘上只有一份,多个程序可以同时引用它,从而降低了磁盘空间的占用。此外,由于动态链接库是在运行时加载的,因此可以动态地升级和替换库文件,这使得软件更新更加方便。

因此,静态链接库和动态链接库各有优缺点,开发者需要根据具体的需求来选择。一般来说,对于一些比较稳定的库文件,可以选择静态链接库,而对于一些常用的库文件,可以选择动态链接库,以便提高代码的重用性和可维护性。

tips:查看依赖库指令ldd mytest

4.gdb使用讲解(调试)

4.1具体操作

进入gdb模式:gdb 可执行文件

特别提醒:如果一个程序是可以被调试的,该程序的二进制文件一定加入了一些debug信息,而在linux下默认形成的文件是release版本的。

为了变成debug版本,应输入以下指令gcc mytest.c -o mytest -g

4.2模式下的操作
指令效果
run直接运行
l 行号显示行号后的代码
b 行号在行号处打断点
info b显现所打断点其情况
s逐语句调试
n逐过程
display 名字显示变量值
undisplay 编号(一定要用编号)使编号不显示
finish结束当前函数
continue直接进入下个断点
until跳转到指定行
set var 变量名修改变量值

5.linux自动化构建工具Makefile

makefile本质就是一个文件 其中包含:编译关系和依赖方法

举个例子:使用vim 写一个 makefile的文件如下(.phony 为修饰一个对应的符号,让符号变成伪目标的概念)

在这里插入图片描述

然后输入指令make

可编译文件mytest就生成了 (如果使用的是c99版本的代码 在 第二行 输入 -std = c99)

输入指令make clean

就将可编译文件mytest删除了

6.有趣的小程序进度条

6.1一个有趣的现象(缓冲区的初了解)

在mytest.c文件下写入这样一段文件:
在这里插入图片描述

和这样一段:(其实就多了个\n)
在这里插入图片描述

会观察到这样一个现象:前面的程序运行了5秒后输出了"Hello world",而后面的程序先输出了"Hello world",程序在运行了5秒,这是为什么呢?

原来printf里面的东西先会放在缓冲区内,而当我碰到\n时会立刻刷新到屏幕上(有关缓存区的具体讲解后面会有这里先做个简单了解)

6.2关于sleep函数的一些小注意

1、windows下的Sleep函数,首字母大写

#include <windows.h> 参数usigned long类型,为毫秒数

Sleep(1);

2、linux下的sleep函数,首字母小写

#include <unistd.h> 其参数为秒数

sleep(1);
(usleep 可以把单位变成微秒)

6.3进度条小程序源码(linux的vim下)
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
#define NUM 100
    char bar[NUM+1];
    memset(bar, '\0', sizeof(bar));

    const char *lable="|/-\\";

    int i = 0;
    while(i <= 100){
        printf("\033[31m[%-100s][%3d%%][%c]\r", bar, i, lable[i%4]);// \r(回车动作)
        fflush(stdout); //立刻刷新到屏幕上
        bar[i]='=';
        i++;
        usleep(50000);
    }
    printf("\n");

}

这里就不过多解释了,有一定代码基础的看懂很容易,放在linux上运行一下感受一下就行

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值