【linux】03-vim和函数库(相关命令)

vim和函数库

vim编辑器的使用

  • vim 由vi 发展过来的一款纯 文件编辑器

  • 前提:安装了vim软件

  • 三种工作模式:

    • 命令模式:打开文件之后,默认进入命令模式

      • 移动光标方法: H(前),J(下),K(上),L(后) 0(首部) $(尾部) gg(文本文件首部) G(当前文件尾部) 500G(行跳转到了第500行)

      • 删除操作:x 删除光标后的字符 X 删除光标前的字符 dw 删除光标所在单词后面的部分 d0 删除光标前面的字符行首 d$ 删除光标后面的字符 D 删除光标后面的内容 dd 删除光标所在的行 ndd 删除光标后n行

      • 删除本质是剪切

      • 撤销操作:u 恢复刚才删除 ctrl + r 反撤销(对应windows下,ctrl z .ztrl y)

      • 复制操作:复制哪一行,光标移到那一行

        y 复制 nyy 复制n行

      • 粘贴操作:(paste)

        • p 在光标所在行的下面做粘贴操作
        • P 在光标所在行做粘贴操作
      • 部分摘取需要用到可视模式: v 进入可视模式 p 复制到光标前面,会发现没有换行,因为可视模式的复制没有复制 -r -n P 复制到光标后面,也没有回车换行

    • 编辑模式:需要输入一些命令,切换到编辑模式

    • 末行模式:在末行模式下可以输入一些命令

  • 模式切换:

    • 命令模式到文本编辑模式:a ios
    • 文本模式退出到命令模式:ESC
    • 命令模式输入:进入末行模式
    • 末行模式回到命令模式:摁两个ESE或者w->保存
    • 文本模式无法到末行模式

命令模式:打开文件之后,默认进入命令模式

  • 移动光标方法: H(前),J(下),K(上),L(后) 0(首部) $(尾部) gg(文本文件首部) G(当前文件尾部) 500G(行跳转到了第500行)

  • 删除操作:x 删除光标后的字符 X 删除光标前的字符 dw 删除光标所在单词后面的部分 d0 删除光标前面的字符行首 d$ 删除光标后面的字符 D 删除光标后面的内容 dd 删除光标所在的行 ndd 删除光标后n行

  • 删除本质是剪切

  • 撤销操作:u 恢复刚才删除 ctrl + r 反撤销(对应windows下,ctrl z .ztrl y)

  • 复制操作:复制哪一行,光标移到那一行

    y 复制 nyy 复制n行

  • 粘贴操作:(paste)

    • p 在光标所在行的下面做粘贴操作
    • P 在光标所在行做粘贴操作
  • 可视模式(可用于部分摘取):

    • v 进入可视模式
    • 选择内容: H J K L
    • 复制:y 删除 : d
    • p 复制到光标前面,会发现没有换行,因为可视模式的复制没有复制 -r -n
    • P 复制到光标后面,也没有回车换行
  • 查找内容:

    • /contentname(反斜杠加内容,黄色高亮) 从光标位置向上查找,后回到原位置
    • ?stdio.h 从光标位置向上查找,后回到原位置
    • #:移到想要查询的单词身上,按下#。上下的都会高亮。
    • 遍历的快捷键:也即切换这些高亮内容用n(向下),N(向上)
    • 单个字符替换用 r
  • 缩进

    • 向后缩进:两个大于号
    • 向前缩进:两个小于号
  • 查看一个函数的man文档:移到 一个函数名字处:shift + K,先输入数字,在K,可以跳转到指定的man文档章节 退出man文档用 q

文本/编辑模式

  • 如何从命令模式进入编辑模式: a i o s
    • a 把字符输入到光标后面 A 光标跳到当前行尾部
    • i 把字符插入当光标前面 I 光标跳到当前行首部
    • o 在光标所在行的下面创建一个新的行 O 在光标所在行的上面开辟一个新行
    • s 以删除光标后字符为代价,换来输入 S 删除整行,开始输入

末行模式的操作

从命令模式进入末行模式,用冒号:(shift +:)

可做行的跳转,加上n

  • 查找替换
    • 替换某行的第一个内容:移到所在行 :s/要替换的单词/替换后的单词 (s表示string,字符串)
    • 替换某行的全部内容:移到所在行:s/要替换的单词/替换后的单词/g
    • 替换文档中所有内容(第一个):移到所在行%s/要替换的单词/替换后的单词
    • 替换文档中全部内容(不止第一个): 移到所在行%s/要替换的单词/替换后的单词/g(%s 代表所有行)
    • 替换某几行的内容::x,ys/tom/jerry/g(x到y全部的行)
    • 不加g就是只替换每一行第一个,加g就是每行的全部
  • 执行命令
    • :!命令如:!pwd
  • 从末行模式回到命令模式
    • 按一个命令
    • 两次ESC
  • 末行模式下保存
    • w 保存
    • q 退出
    • q! 退出不保存
    • wq 保存并退出 等价于 x(命令模式下摁两个Z也可以保存并退出)

vi分屏操作

频繁切换返回文件很浪费时间,能保存原来的状态

操作:在末行模式下输入命令:

  • 水平分屏 : sp(分成上下两部分,要想同步需要经常的保存操作)
  • 垂直分屏 :vsp(v表示vertical垂直的)
  • 指定另一个窗口打开当前文件夹下一个文件::vsp mainwindow.cpp
  • 切换分屏:ctrl ww 在两个屏幕间切换
  • 关闭分屏 qall退出所有 wall保存所有 q关掉光标不在的那个屏幕

vim 打造 IDE

依旧不带目录菜单,反而需要记住更多快捷键,修改配置文件

  • 系统级配置文件目录:/etc/vim/vimro (影响所有用户)
  • 用户级配置文件目录:~/.vim/vimro

gcc编译器的编译过程

总结

预处理->编译->汇编->链接

-o 指定生成文件名字 -D 在编译时定义宏 -I 指定头文件路径 -g gdb调试时需要添加该参数

-O编译优化 -Wall 编译时输出警告信息

图片理解
  • .c是c语言源程序文件,人类可读,可按照程序设计语言编写
  • 生成预处理文件: gcc -E 文件名.c [-o 指定的c文件名.i] 此处的c文件里宏被替换为指定的值,头文件都被包含了,注释都被去掉了。(三步,头文件展开,宏替换,注释去掉)
  • 编译:gcc -S 文件名.i -o 指定的汇编文件名.s
  • 汇编器处理,生成二进制文件:gcc -c 汇编文件名.s -o 指定的二进制文件名.o (此时完全看不懂)
  • 链接器处理:gcc 二进制文件名.o -o 指定的可执行文件名字
  • 处理参数是 E S c
  • 不加-o会默认一个a.out,加-o 产生目标文件
  • 直接把一个源程序编译成一个可执行程序:gcc xxx.c -o yyy(调用的是链接文件,是一个递归调用)
  • 头文件路径指定(-l):gcc sum.c - I ./目录名 -o 生成名字
  • 在执行命令命令时指定一个宏,让一些注释的log不被输出(-D):gcc sum.c -I 目录名 -o 生成名字 -D DEBUG (无需在每个文件内都宏定义,只需在编译时宏定义)
  • -O 优化程序 -O0 不优化 -O1/-O2/-O3(最高等级是3,对冗余代码优化)
  • -Wall 输出警告信息,定义也没用的也会提示
  • -g 在应用程序中添加调试信息,生成文件大小会相对变大

静态库

源代码不开源,后期维护也付费,长期合作,否则是一锤子买卖

正常默认的目录名字:include 存放头文件 lib存放库 src存放源文件(后缀是.c)

命名规则

lib+库名(自命名) +.a ,例如libmytest.a的库名是mytest

制作步骤

1.生成对应的.o文件(.o是二进制文件,由.c得到,不把实现展示给用户): gcc *.c -c

2.将生成的.o文件打包为库(后缀为.a): ar rcs + 生成的静态库的名字(libMytest.a) + * .o

3.使用 main.c -Llibpath -llibname -o app -Iinclude

发布和使用静态库

  • 发布静态库

  • 头文件也打包发过去(显示接口函数如何预定义的)

  • 发布程序,两种封装指令

    • 由测试main.c,调用封装的静态库,制作成可执行程序
    • gcc main.c lib/libMyCala.a -o sum -I include(包含进头文件)
    • gcc main.c -I include -L lib(指定调用静态库的目录) -l MyCalc(指定库目录下库的名字,掐头去尾) -o myapp(可执行的文件)

静态库的优缺点

  • nm可以查看.a里边的内容
    • .a由一个个.o组成
  • nm可以查看.exe文件里面的内容
    • main是连接是加进去的启动代码 add本身是源代码,所以会被放到代码区
    • T–代表是在代码区(类似由全局数域区)
    • 主程序中用到了那个,就会在编译时打包调用用哪个.o文件,没用到的不需要
  • 静态库的优点:
    • 发布程序时,不需要对外提供库
    • 库本身就在可执行程序中,库的加载速度比较快
  • 静态库的缺点:
    • 库被打包到应用程序中,导致库的体积很大。
    • 库发生了改变,需要重新编译程序。

动态库/共享库的制作

虚拟地址空间

对应于windows下dll的文件

静态库中.o放到的是代码区,用的是绝对地址

动态库中,.o不会打包到可执行文件中,只是做个符号的记录,程序执行起来才会加载动态库,放到的是共享库中,位置是变动的,用相对地址+共享库分配初始化地址

命名规则

lib + 名字 +.so

制作步骤

1.生成与位置无关的代码.o(生成与位置无关的.o)

  • gcc -fPIC -c *.c
  • 加 -c 是为了生成.o

2.将.o打包成共享库/动态库,即.so的文件

  • gcc -shared -o libMyTest.so *.o -Iinclude

3.发布和使用动态库 : main.c lib include

  • gcc main.c lib/libMyCalc.so -o app -Iinclude
  • gcc main.c -Iinclude -L./lib -lMyCalc -o myapp
  • ldd 命令查看可执行程序在执行时所依赖的所有共享库
    • ldd xxx
    • 返回库的地址,标准C库的地址
    • 可执行程序调用动态库时依赖的是动态链接器(本质是动态库,是ldd下的最后一个返回内容)

4.解决动态库链接失败问题

  • 找不到的原因是环境变量配置问题

    • 可以把刚刚生成的libMyCalc.so放到lib动态库中(实质上不应该采取这个办法)
    • **必掌握临时设置法:**配置一个环境变量,把库的路径指定给LD_LIBRARY_PATH这个环境变量(临时存储,重启后清除,临时导入,便于做测试),则此时会在默认的环境变量之前调用这里的路径
      • echo $LD_LIBRARY_PATH发现没有值
      • 赋值并导进去,export LD_LIBRARY_PATH=./lib
    • 实现库的导入的永久设置(设置到当前用户的bash配置文件中)
      • cd
      • ls -a
      • vi bashrc
      • 写入export LD_LIBRARY_PATH=/home/itcast/…
    • 必掌握永久设置法:
      • 找到动态链接器的配置文件 cd /etc
      • 把动态库的路径写到配置文件中 ls -l ld.so.conf sudo vi ld.so.conf 进入后按o键键入内容,wq保存
      • 更新 – sudo ldconfig -v(查看信息)
      • cd xxx ldd xxx 观察到确实是连接到了路径
  • 动态库的优缺点:

    • 如果调用了动态库,不会把应用程序打包到动态库中,只是会做一个标记,指出这个时候调用动态库中哪个函数
    • 程序执行时,先把动态库加载进来,之后调用动态库中对应函数,完成对应操作
    • 优点:包比较小,更新方便,不需要重新编译程序(前提是函数接口不变)
    • 缺点:需要把动态库提供给用户,没有被打包到应用程序中,相对静态库慢一点点
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值