自学内容网 自学内容网

第22天Linux下常用工具

目录

第 1 章 vim 编辑器

1.1 vim 安装

1.2  vim 的使用

1.3 vim 的 4 种工作模式

第 2 章 gcc 编译器

2.1 编译流程(以 main.c 为例)

2.2 gcc 的常用参数

2.3 进行多模块编译

第 3 章 动态库静态库的制作

3.1 库的作用

3.2 库的分类与特点

3.3 静态库的制作

3.4 动态库的制作

3.5 更新动态库的操作


第 1 章 vim 编辑器

vim、vscode、gedit 皆为编辑器,为用户提供编写代码的平台。其中,vim 相对较难使用,在某些公司不允许私自安装软件的情况下,可能只能使用 Linux 系统自带的编辑器 vi。

vim 与 vi 有何关系呢?----vim 可理解为 vi 的扩展版。

1.1 vim 安装

使用以下命令进行安装:

sudo apt-get install vim

1.2  vim 的使用

1.2.1 打开 vim 文件:通过输入文件名即可打开。


1.2.2 关闭:

先按 ESC 键,退出到命令模式,然后输入冒号(Shift+;)进入底行模式,输入 wq,回车即可保存并退出。若要强制退出,可在底行模式输入 q!。

强制退出时可能会在再次打开时受阻,这是找到强制删除产生的文件,删除即可,但原文件可能未保存强制删除前刚进行的修改。

1.3 vim 的 4 种工作模式

  1. 命令模式:文件打开后的默认模式,可通过输入快捷指令直接实现对文件内容的操作。
    • 复制:
      • yy:复制光标所在的一行。
      • nyy:n 为要复制的行数,复制从光标所在位置开始向下的 n 行。
      • yw:复制光标所在位置的一个单词。
      • nyw:n 为要复制的单词数,复制从光标所在位置开始向后的 n 个单词。
    • 粘贴:p:粘贴到光标所在位置的下一行。
    • 剪切:
      • dd:剪切 / 删除光标所在的一行。
      • ndd:剪切 / 删除从光标所在位置开始向下的 n 行。
      • dw:剪切 / 删除光标所在位置向后的一个单词。
      • ndw:剪切 / 删除光标所在位置向后的 n 个单词。
    • 撤销:u:撤销一步操作,连续按可一直撤销。
    • 反撤销:ctrl+r:退回一步撤销操作。
    • 光标定位:
      • 光标回到文件开头:gg
      • 光标到文件末尾:G
  • 插入模式:可直接进行文件内容的编辑。在命令模式下,进入插入模式有以下几种方式:
    • a:插入光标所在位置之后。
    • A:插入光标所在位置行尾。
    • i:插入到光标当前位置。
    • I(大写的 i):插入到光标所在位置行首。
    • o:在光标所在位置下一行生成新的空行,并在空行插入。
    • O:在光标所在位置上一行生成新的空行,并在空行插入。
  • 可视模式:一次性的快捷指令操作,然后会退回命令模式。在命令模式下,按v进入可视模式,使用上下左右按键移动光标选中文本,选中文本之后:
    • y:复制。
    • d:剪切。
    • x:删除。
  • 底行模式:类似于终端,通过输入指令可对文件以及文件内容进行更加复杂的操作。
    • 进入底行模式的方法一:输入:后可进行以下操作:
      • w(回车):保存。
      • q(回车):退出。
      • wq(回车):保存并退出。在对应的操作后加!代表强制执行,例如:q!强制退出。
      • 文本替换:%s/原字符/修改后的字符/g(回车):全部替换;m,ns/原字符/修改后的字符/g(回车):将从 m 行到 n 行的替换。
      • 挪动整行的位置:xmy:将第 x 行放到第 y 行下面。
    • 进入底行模式的方法二:输入/ /字符串:进行字符串查找。

第 2 章 gcc 编译器

2.1 编译流程(以 main.c 为例)

编译流程分为以下几步:便记[ESC][ISO]

  1. 预编译:gcc -E main.c -o main.i -I./
  2. 编译(转汇编):gcc -S main.i -o main.s
  3. 汇编(转二进制):as main.s -o main.o(静态库和动态库都是以.o 文件为基础制作的)。
  4. 链接(链接库):gcc main.o -o main

2.2 gcc 的常用参数

  • -o:对生成的可执行文件命名。
  • -I(大写的 i):后面紧跟头文件路径(如果头文件和源文件在同一个路径下可以省略)。
  • -l(小写的 L):后面跟库名 (lib)。
  • -L:后面跟库的路径(即使库在当前路径下也不能省略)。
  • -g:生成带有调试信息的程序,比正常生成的可执行程序要大(配合明天要讲的代码调试工具)。
  • -c:执行编译四步的前三步(只编译不链接),生成.o 文件。

2.3 进行多模块编译

2.3.1 四步编译流程。

gcc -E main.c -o main.i
gcc -S main.i -o main.s
as main.s -o main.o
gcc main.o -o main

2.3.2 两步编译流程。

gcc -c main.c -o main.o -I./inc
gcc main.o -o main

此处的-I./inc是引用包含头文件,如果不需要可以不加 

第 3 章 动态库静态库的制作

3.1 库的作用

保护代码、封装代码、方便移植。

3.2 库的分类与特点

分为静态库和动态库。

  • 静态库的特点:以空间换时间。依赖静态库编译生成可执行程序时,会将静态库中的代码复制到可执行程序中去。所以生成的可执行程序所占空间更大,但运行所耗费的时间较少。更新静态库后,若不重新生成可执行程序,其功能不会跟着更新,需要重新生成可执行程序。使用静态库时,静态库更新了,可执行文件也需要更新
  • 动态库的特点:以时间换空间。依赖动态库编译生成可执行程序时,不会将动态库中的代码复制到可执行程序中去。所以生成的可执行程序所占空间小,但运行过程中会现场去动态库中查找用到的源代码并执行,所消耗的时间较多。更新动态库后,不更新可执行程序,可执行程序的功能会跟着更新,不需要重新生成可执行程序。使用动态库时,动态库更新了,可执行文件不需要更新,也能使用新的功能。

静态库关系图示:


动态库关系图示:


使用静态库和动态库生成的执行文件大小不同:

由静态库生成的main比动态库生成的mainm文件大一些

3.3 静态库的制作

  1. 准备好功能函数add.cadd.h等。
  2. 将功能函数只编译不链接生成.o 文件(一个一个来,有几个.c 生成几个.o):
    • gcc -c add.c -o add.o
    • gcc -c jian.c -o jian.o

  • 将这些.o 文件打包成静态库:ar -rc libxxx.a *.o(这里的 xxx 是可以随意填写的,不要出现中文)。

  • 依赖静态库生成可执行文件:gcc main.c -l(小写 L)库名(只写 xxx, lib 和.a 都不要) -L 库的路径 -I(大写的 i)头文件路径 -o main

3.4 动态库的制作

  • 准备好功能函数add.cadd.h等。
  • 将功能函数只编译不链接生成.o 文件。
  • 将这些.o 文件打包生成动态库:gcc -shared -fpic -o libxxx.so *.o(xxx 自己用英文命名)。
  • 将生成的动态库移动到系统的动态库检索路径下:sudo mv libxxx.so /usr/lib

  • 依赖动态库编译生成可执行文件:gcc main.c -l(小写的 L)库名(xxx) -I(大写的 i)头文件路径

3.5 更新动态库的操作

只需要重新编译生成动态库并移动到指定目录/usr/lib即可,不需要重新链接。


原文地址:https://blog.csdn.net/Charary/article/details/143691210

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!