Linux(二) 常用工具

Linux(二) 常用工具

一、编辑器

linux常见编辑器有:vi编辑器、vim编辑器、gedit编辑器,还可以用vscode作为编辑器
vi编辑器是Linux内置的编辑器

界面如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gkilJ63d-1639064323011)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211208175013883.png)]

vim编辑器是vi编辑器的增强版,使用与vi编辑器类似

界面如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qqGiXzal-1639064323013)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211208175018109.png)]

vim两种安装方式(下面两种编译器安装和这个一样就不再赘述):

在线安装 需要联网(推荐):

sudo apt-get update  	# 首先更新软件源列表 ,至于为什么在线安装软件时要更新软件源列表,请看我的这篇文章https://blog.csdn.net/weixin_46113614/article/details/121803060
sudo apt-get install vim    # 安装vim

离线安装 需要提前下载好安装包,如果需要相关依赖还需要下载依赖,没有在线安装方便:

dpkg -i vim.deb
vim的操作
vim具有四种模式:命令模式、插入模式、底行模式、可视模式
命令模式:当打开文件时默认是命令行模式
 vim test.c  # 打开/创建 test.c 文件
 vim +10 test.c # 打开test.c并跳转到第十行
  • d0 :删除光标之前的字符到行首,不包含光标所在的字符
  • (n)x:删除光标处的字符(n代表向右要删除的字符数)
  • (n)X:删除光标前的字符(n代表光标前字符向左要删除的字符数)
  • D 或d$ :删除光标之后的字符到行尾,包含光标所在的字符
  • (n)dd :删除一整行,从光标所在行往下一行一行删除,n代表要删除的行数
  • (n)dw:删除一个单词(n代表要删除的单词数)
  • (n)yy :复制n行 所在行往下计算
  • n+enter: 光标下移动n行
  • 0: 光标移动到本行开头
  • $:光标移动到行尾
  • nG:光标移动到第n行
  • p:粘贴,从光标所在行的下一行开始粘贴
  • u:撤销操作
  • ctrl + r:反撤销

屏幕滚动:

  • ctrl + u :将屏幕向前翻滚半屏幕
  • ctrl + d :将屏幕向后翻滚半屏幕
  • ctrl + f :将屏幕向后翻滚一屏幕
  • ctrl + b :将屏幕向前翻滚一屏幕
  • gg :跳到文件首
  • G :跳到文件尾
插入模式
  • i:在光标处插入字符
  • I:在行首插入字符
  • a:将文本加到光标所在位置之后
  • A:将文本追加到所在行尾
  • o:在光标所在行的下一行插入空行
  • O:在光标所在行的上一行插入一个空行
底行模式
  • shift zz :保存并退出编辑器

  • w :保存

  • w!:强制保存

  • wq:保存并退出

  • q!:强制退出

  • /字符串:从光标开始向后搜索(n:向下 N:向上)

  • ?字符串:从光标开始向前搜索

  • :%s/源字符串/要替换的字符串:替换文件里的所有的行的第一个源字符串

  • :%s/源字符串/要替换的字符串/g:替换文件里的所有的源字符串

  • :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky

  • :n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky (n 为数字,若 n 为 .,表示从当前行开始到最后一行)

可视模式

在命令模式下 按v进入视图模式 : shift + v 进入以行为单位进行选取的可视行模式,ctrl + v以块为单位进行选取的可视块模式

d:删除

y:复制

x:剪切

p:粘贴

gedit编辑器是具有图形化界面的编辑器,比vim、vi更方便

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9dHfx4XB-1639064323014)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211208174844917.png)]

vscode编辑器也是图形化编辑器,具有代码提示功能、代码可自动格式化、提供各种插件,非常好用,极力推荐,至于安装教程,网上一大堆,这里就不赘述了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dOwFUqHd-1639064323016)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211208174809449.png)]

二、编译器

作用:将c程序编译成二进制的机器语言
程序编译过程: 程序预处理---->编译------->汇编-------->链接
1.预处理

根据以字符#开头的命令读取系统头文件、宏定义等,修改原始的C程序(头文件替换、宏定义的替换、条件编译的处理)。.c 将会变成 .i 文件。比如:

// 预编译前
#define MAX(a,b)    a>b? a:b

int main(void)
{
    printf(%d\n”,MAX(a,b));
}

// 预编译后
int main(void)
{
    printf(%d\n”,a>b ? a:b);
}

预编译指令:gcc -E app.c -o app.i

2.编译

编译器将 .i 文件编译成汇编语言生成 .s 文件

编译指令:gcc -S app.i -o app.s

3.汇编

汇编器将hello.s 翻译成机器语言指令,生成目标文件 .o 文件

汇编指令:as app.s -o app.o

4.链接

链接器将多个目标文件合并成一个可执行文件

链接指令:gcc app.o -o app

其他内容

​ 只编译,不链接:gcc -c helloworld.c

​ -g选项,产生供gdb调试用的可执行文件:gcc -g helloworld.c

什么是库?

在这里援引百度百科的描述:库文件是计算机上的一类文件,提供给使用者一些开箱即用的变量、函数或类。库文件分为静态库和动态库,静态库和动态库的区别体现在程序的链接阶段:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库系统只需载入一次,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存,而且使用动态库也便于模块化更新程序。

库分为动态库和静态库
静态库:

程序链接阶段会被加入到程序中, 如下图所示main.c 调用了 static.c 里的 Output函数,我们每次编译main.c时都需要将static.c 一同编译。如果将static.c封装成静态库,我们每次编译main.c 时,只需加static.h头文件就行了 就像我们使用printf()函数要加#include<stdio.h> 一样,其他程序一样可以用同样方式调用该函数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LODgsG6D-1639064323017)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211209191907193.png)]

静态库的创建:

​ 1:只编译不链接

​ gcc -c static.c

​ 2:创建静态库

​ ar rc libstatic.a static.o

​ 3:加载静态库

​ gcc -o app app.c -lstatic -L./

​ -l:指定库

​ -L:指定库的路径

动态库:

程序链接阶段不会被加入到程序中,运行时由系统加载到内存供程序调用

gcc -fPIC -shared -c static.c -o static.o

gcc -fPIC -shared static.o -o libstatic.so

gcc main.c -o main -lstatic -L ./

./main

注意: 当执行 ./main 时会出现错误,原因如下:由于动态库是由系统加载到内存的,这样我们程序运行时才能调用。

​ 解决办法:1. 把我们的动态库文件放到系统指定的动态库目录里:根目录下的 lib 或者 usr/lib 下

  1. 将我们当前所在目录声明为动态库目录(就是添加环境变量):

    • export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: 当前所在路径 (仅在当前终端窗口有效,关闭窗口失效)

    • 所有用户永久添加某一环境变量, 打开 /etc/profile,在文件末尾添加: export PATH=“自己的目录全路径:$PATH”

      保存退出后在终端输入source /etc/profile 使其生效

    • 当前用户永久添加环境变量,打开/root/.bashrc,在文件末尾添加: export PATH=“自己的目录全路径:$PATH”

      保存退出后在终端输入source ~/.bashrc 使其生效

GDB代码调试工具

GDB是UNIX / Linux 下的一款代码调试工具,它可以调试C、C++、Python等代码,虽然没有图形化界面但也是一款不错的工具。

使用方法:

1、编译程序时

gcc -g test -o test.c

2、启动

gdb ./test

3、相关命令

r: 运行程序

where: 显示出出错的位置

l : 列出全部代码

b n : 在程序的第n行设定断点

info breakpoint : 查看断点的信息(有哪些断点、是否使能、在代码的那一行、断点号是多少)

cont : 继续往下执行 直到遇到下一个断点

d n : 删除断点号为n的断点

disable n : 失能n号断点(使其失效)

enable n : 使能n号断点(使其有效)

clear n : 删除行号为 n的断点

p i :打印当前变量i的值

start : 启动调试( next step)

finish :结束循环 结束函数

next : 按行调试,遇到函数直接执行的得到结果

next n : 直接跳转到第n行

step : 跳入函数内部,一步一步执行

step s : 跳转到指定行,如果该行是函数,则跳转到函数内部

quit : 退出

Makefile

什么是makefile ?

当我们用C写一个工程时,工程里面有很多C文件,当我们编译这个工程时我们需要用gcc 把所有c文件一同编译这很繁琐,如果我们改动其中一个C文件,一需要全部重新编译一遍,很麻烦。这些C文件里的函数、变量、宏定义 互相被调用,这被称为依赖关系,这些依赖关系在代码里就是通过互相调用头文件来实现,这些头文件是不变的,如果我们把它们整合在一个文件里,每次编译时只调用这一个文件,将会大大提高灵活性。 makefile就是将这种依赖关系整合到一个文件里。

操作方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UcnZnTga-1639064323018)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211209223553205.png)]

有上图两个C文件 main.c 和 static.c 文件

其中 main.c 里调用了 static.c 里的 Output函数

1.创建makefile(或者Makefile)文件

vim makefile 注: 文件名一般设置为 makefile 或 Makefile ,当然你也可以自己设定文件名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lsw0mEbT-1639064323019)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211209225315025.png)]

依赖关系图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VqDPKEiw-1639064323021)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211209230246727.png)]

2.编译

  • 直接在终端命令行输入 make指令 ,然后编译成功后,生成可执行程序main,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-01RfeB1H-1639064323022)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211209231754570.png)]

如果程序有改动需要重新编译,我们需要把之前生成的 *.o 文件删除 ,就可以使用 make clean 将之前的 *.o 文件删除,一次性全部删除

如果你的文件名不是makefile则需要 加上 -f 指定文件 如: make -f makfi

使用 make clean -f makfi 将之前的 *.o 文件删除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTqIg2Qf-1639064323023)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211209231554690.png)]

关于伪目标

前面我们看到make clean,是因为我们在 maikefile;定义了clean ,它作为一个伪目标 用于执行 rm -rf *.o 指令,如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xpC0Oy4G-1639064323025)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211209232804131.png)]

有一点我们需要注意:如果makefile所在的目录下有 以clean命名的文件,当执行make clean时会报错,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rkRtVMuB-1639064323026)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211209233129857.png)]

解决方法:

​ 在makefile文件里面,声明它是一个伪目标

.PHONY : clean

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CbMbyuTu-1639064323027)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211209233418610.png)]

再次尝试make clean 执行正常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k9Gmvdxz-1639064323029)(C:\Users\纵横四海\AppData\Roaming\Typora\typora-user-images\image-20211209233453706.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值