Linux(二) 常用工具
一、编辑器
linux常见编辑器有:vi编辑器、vim编辑器、gedit编辑器,还可以用vscode作为编辑器
vi编辑器是Linux内置的编辑器
界面如图所示:
vim编辑器是vi编辑器的增强版,使用与vi编辑器类似
界面如图所示:
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更方便
vscode编辑器也是图形化编辑器,具有代码提示功能、代码可自动格式化、提供各种插件,非常好用,极力推荐,至于安装教程,网上一大堆,这里就不赘述了。
二、编译器
作用:将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> 一样,其他程序一样可以用同样方式调用该函数。
静态库的创建:
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 下
-
将我们当前所在目录声明为动态库目录(就是添加环境变量):
-
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就是将这种依赖关系整合到一个文件里。
操作方法:
有上图两个C文件 main.c 和 static.c 文件
其中 main.c 里调用了 static.c 里的 Output函数
1.创建makefile(或者Makefile)文件
vim makefile 注: 文件名一般设置为 makefile 或 Makefile ,当然你也可以自己设定文件名
依赖关系图如下:
2.编译
- 直接在终端命令行输入 make指令 ,然后编译成功后,生成可执行程序main,如下图所示:
如果程序有改动需要重新编译,我们需要把之前生成的 *.o 文件删除 ,就可以使用 make clean 将之前的 *.o 文件删除,一次性全部删除
如果你的文件名不是makefile则需要 加上 -f 指定文件 如: make -f makfi
使用 make clean -f makfi 将之前的 *.o 文件删除
关于伪目标
前面我们看到make clean,是因为我们在 maikefile;定义了clean ,它作为一个伪目标 用于执行 rm -rf *.o 指令,如下图所示
有一点我们需要注意:如果makefile所在的目录下有 以clean命名的文件,当执行make clean时会报错,如下图所示:
解决方法:
在makefile文件里面,声明它是一个伪目标
.PHONY : clean
再次尝试make clean 执行正常