Linux——基础(vim,gcc编译,静态库,动态库)
1,vim基本使用介绍
vim被称为编辑器之神,vim是可以打造成IDE的,现阶段水平的作者用到,这里不再详述。只介绍简单的使用。
- vim的三种模式
1)命令模式 -- 打开文件之后,默认进入命令模式,vi 文件名字
2)编辑模式/输入模式 --需要输入一些命令,切换到编辑模式
3)末行模式 --在末行模式中可以输入一些命令(不保存退出:q,保存退出:wq,保存当前文件:w)
- vim中的命令模式下操作
vim中是不允许使用鼠标的,只能通过一些命令来操作。
1)光标的移动: H 向前, J 向下, K 向上, L 向后, 0 移动到当前行的行首, $ 移动到当前行的行尾, gg 移动到当前文件的开始位置,G 移动到文件的尾部,500(任意数字) G 跳到对应的行500 G 是跳到第500行。
2)删除操作:x 删除光标后面的字符,X 删除光标后面的字符, dd 删除当前行的内容,d0 删除这一行光标前面的内容,
D 删除这一行光标后面的内容,4dd 删除光标往后的4行数字4可以任意指定,u 撤销前一步操作,ctrl + r 反撤销
3)粘贴操作:2)中讲到的删除,实质上并不是删除,而是剪切。执行上面的命令后,执行p|P就可以粘贴了。p是粘贴在光标所在行的下一行,而P是粘贴在光标所在行。
4)复制操作: yy 复制当前行,nyy 复制光标后n行(包括光标行),
5)可视模式:命令行模式时按v可以进去可视模式,在可视模式下,hjkl可以选择需要进行操作的文本数据,在可视模式下,d是删除,y是复制,p|P是粘贴。
6)数据的查找 : 按/,之后输入要查找的数据,按回车即可。回车之后可以使用n在查找结果里进行来回切换。
要统计某个单词的个数,把光标移动到这个单词上,然后按#键,回车之后可以使用n在查找结果里进行来回切换。
7)缩进: 向右缩进 >> ,向左缩进 <<
8)保存退出:ZZ
- vim编辑模式
1)从命令模式切换到编辑模式的命令:
a:在光标所在位置的后方插入 A:在当前行的尾部插入
i:在光标所在位置的前面插入 I:在当前行的开始位置插入
o:在光标所在行的下方开辟新的行 O:在光标所在行的上方开辟新的行
s:删除光标处的字符,从字符后面开始插入 S:删除光标所在的行,并开始插入
- 末行模式
1)进入末行模式的方式: 从命令模式不能直接进去末行模式,只能从编辑模式下进入末行模式,通过:即可。
2)行的跳转:输入末行后直接输入输入行号就可以做到行的跳转
3)字符串的替换:
在末行模式下,替换光标所在行的命令如下:s/要替换的文本/目标文本[/g] 注意,如果不加/g,说明只替换本行中的第一个匹配到的字符串,加上/g是替换所有匹配到的字符串。
在末行模式下,替换所有行的命令如下: %s/要替换的文本/目标文本[/g] 注意,如果不加/g,说明只替换所有行中的第一个匹配到的字符串,加上/g是替换所有行所有匹配到的字符串。
在末行模式下,替换指定行的命令如下: 起始行,结尾行s/要替换的文本/目标文本[/g] 注意,如果不加/g,说明只替换指定行中的第一个匹配到的字符串,加上/g是替换指定行所有匹配到的字符串。
4)在末行模式下是可以输入命令的: pwd,ls等等,注意,w是保存修改的文件,q是退出末行模式,wq是保存退出,q!是不保存退出。
5)分屏命令:
水平分屏: sp [文件的名字]
垂直分屏(比较常用): vsp [文件的名字]
注意,ctrl + ww就可以在两个屏幕之间切换,文件的名字是可选的,如果不写的话,默认将本文件分屏,如果写的话就是将指定文件的内容显示在新增加的文件中。注意,退出时,想退出那个就在哪个屏幕下输入命令即可,也可以在命令的后面加all,对两个屏幕同时操作,比如,qall,含义是退出所有屏幕。
2,GCC编译器
- gcc编译器的编译过程
注意gcc在编译.c文件的时候会经过四步(注意命令的大小写):
第一步:通过 gcc -E命令调用预处理器对.c文件执行预处理,此时的操作会将头文件展开,把宏替换掉,去掉注释。此时还是.c文件。
第二步:通过gcc -S命令把预处理后的文件编程汇编文件,此时文件后缀是.s
第三步:通过gcc -c命令调用汇编器对汇编文件进行编译生成二进制文件,此时文件后缀是.o
第四步:通过gcc 命令调用链接器,将二进制文件链接成可执行程序。
- gcc的一些参数
通过gcc XXX.c -o myapp命令可以直接生成可执行程序,上面的1,2,3步在背后执行。不指定-o时会默认生成a.out可执行程序。
下面对一些常用参数进行说明:
-I 指定头文件的路径 gcc XXX.c -I 路径 -o 可执行程序的名字
-D 指定宏的名字 gcc XXX.c -I 路径 -o 可执行程序的名字 -D 指定宏的名字
-O[1|2|3] 编译的时候是否优化,3的等级最高
-Wall 编译的时候,输出警告信息
-g 添加调试信息
-L 指定静态库的路径
-l 指定静态库的名字,注意静态库的命名规则是lib + 库的名字 + .a,此时只写库的名字
3,静态库
- 命名规则: lib + 库的名字 + .a(注意linux中静态库的后缀是.a)
- 制作静态库
第一步:生成对应的.o ,将.c文件生成.o文件的命令 gcc -c
第二步:将.o文件打包 命令是: ar rcs 生成的静态库的名字(libMytest.a) 所有的.o
- 发布和使用静态库(要给两部分内容)
1)发布静态库
2)头文件(提供这个主要作用是告诉用户这个库提供了哪些接口)
使用库时,有两种方法:
第一种: gcc XXX.c lib/libXXX.a(静态库的路径) -I头文件的路径 ,,这种是直接指定的方式
第二种: gcc XXX.c -L lib -l XXX -I头文件的路径 ,,这种是使用-L和-l参数的方式
- 静态库的优缺点
注意可以使用nm 静态库的名字这个命令来查看静态库里面的内容。
优点:1)发布程序时,不需要在提供库,因为已经打包好了。2)加载库的速度比较快
缺点:1)因为打包的时候是以.o为最小单位的,把库打包到应用程序中,导致库的体积很大。注意,一个.o文件中可能有几个函数,但是在写的程序中用到其中一个函数,就要把整个.o文件打包到应用程序中。
2)库发生改变的时候需要重新编译程序。
4,动态库
- 命名规则: lib + 库的名字 + .so
- 制作步骤
第一步:生成与位置无关的代码(生成与位置无关的.o) 命令: gcc -fPIC -c *.c -I头文件路径
第二步:利用上一步生成的.o 生成动态库 gcc shared -o libXXX.so *.o(所有的.o)
- 发布和使用动态库(要给两部分内容)
1)发布静态库
2)头文件(提供这个主要作用是告诉用户这个库提供了哪些接口)
使用库时,有两种方法:
第一种: gcc XXX.c lib/libXXX.so(动态库的路径) -o 输出应用程序的名字 -I头文件的路径 ,,这种是直接指定的方式
第二种: gcc XXX.c -L lib -l XXX -I头文件的路径 -o 输出应用程序的名字,,这种是使用-L和-l参数的方式
可以使用ldd命令来查看应用程序所使用的所有的共享库(动态库)。
- 动态连接库链接不成功的解决方案
第一种方法: 在linux中,LD_LIBRARY_PATH中存放的是,可以存放动态库的除了默认路径之外的其他路径。将自己做的动态库的路径加到LD_LIBRARY_PATH中,执行命令export LD_LIBRARY_PATH=自己做的动态库的路径,就可以了,但是这种方法只是临时的,关掉终端就不可以了,因此可以用做测试的时候使用。
第二种方法:可以实现永久的设置,将路径配置在bash的配置文件.bashrc中,将语句export LD_LIBRARY_PATH=自己做的动态库的路径写在配置文件的最后一行就可以了。这种方法,设置好,需要重新启动虚拟终端才可以生效。
第三种方法(必须掌握的):
第一步:需要找到动态链接库的配置文件 etc/ld.so.conf
第二步:把自己做的动态链接库的路径写到里面
第三步:执行完第二步,动态链接器还不知道自己的配置文件已经被修改,因此需要做一个更新的操作,
命令是sudo ldconfig -v(查看信息输出)
- 动态库的优缺点
优点:如果使用动态库,是不会把库的代码打包到应用程序中的,因此使用动态库的应用程序的体积比较小。使用动态库只是在程序中做一个标记,等程序运行起来的时候才会调用动态库的代码。动态库如果更新了,不需要重新编译程序(前体是接口不变)。
缺点:发布程序的时候,需要把库提供给用户;动态库程序的加载比较慢。