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动静态库
我们的库分为两者:
- 静态库(文件后缀名为.a)
- 动态库(文件后缀名为.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 可以把单位变成微秒)文章来源:https://www.toymoban.com/news/detail-434442.html
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上运行一下感受一下就行文章来源地址https://www.toymoban.com/news/detail-434442.html
到了这里,关于linux中基础开发工具的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!