目录
第 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 种工作模式
- 命令模式:文件打开后的默认模式,可通过输入快捷指令直接实现对文件内容的操作。
- 复制:
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]
- 预编译:
gcc -E main.c -o main.i -I./
。 - 编译(转汇编):
gcc -S main.i -o main.s
。 - 汇编(转二进制):
as main.s -o main.o
(静态库和动态库都是以.o 文件为基础制作的)。 - 链接(链接库):
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 静态库的制作
- 准备好功能函数
add.c
、add.h
等。 - 将功能函数只编译不链接生成.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.c
、add.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
即可,不需要重新链接。