alin的学习之路(Linux系统编程:三)(vim,gcc,库,gdb)

alin的学习之路(Linux系统编程:三)(vim,gcc,库,gdb)

1.vim的使用

vim有三种模式:命令模式,末行模式,编辑模式

  1. 光标的移动【命令模式】

    1. h 向左 ,j 向下,k 向上,l 向上
    2. 移动到行首:^ 移动到行末:$
    3. 移动到屏幕顶部:H 移动到屏幕中间:M 移动到屏幕底部:L
    4. 移动到文件顶部:gg 移动到文件底部:G
  2. **自动调整格式:**G=gg

  3. 剪切粘贴【命令模式】

    1. dd剪切一行,p粘贴到光标所在的下一行
    2. ndd 剪切多行,p粘贴到光标所在的下一行
    3. 选中剪切
      1. 选中多行:大写 V 选中后按d剪切,p 粘贴到光标所在的下一行
      2. 选中多个字符:小写 v 选中后按d剪切,p 粘贴到光标所在的下一行
      3. 取消选中:ESC
  4. 撤销与反撤销【命令模式】

    1. 撤销:u
    2. 反撤销:Ctrl+r
  5. 拷贝粘贴【命令模式】

    1. yy 拷贝一行,p粘贴到光标所在的下一行
    2. nyy 拷贝多行,p粘贴到光标所在的下一行
    3. 选中拷贝
      1. 选中多行:大写 V 选中后按d剪切,p 粘贴到光标所在的下一行
      2. 选中多个字符:小写 v 选中后按d剪切,p 粘贴到光标所在的下一行
      3. 取消选中:ESC
  6. 查找替换【末行模式】

    1. 查找替换规则:{范围}s/{被替换内容}/{替换成为的内容}/替换标志
      1. 范围:行范围。表示:1,10 表示第一行到第10行,%表示整个文件,点(.)表示当前行
      2. 替换及被替换内容:字符串
      3. 替换标志:不写替换标志模式替换每行的第一个对应字符串,替换标志 g 表示替换每行的全部对应字符串
    2. 末行模式输入noh+回车取消高亮
  7. 代码注释【命令模式】

    1. 方法1:
      1. 添加注释:V 选中要添加注释的行,按gc完成添加注释
      2. 取消注释:V 选中要添加注释的行,按gc完成取消注释
    2. 方法2:
      1. 添加注释:按 Ctrl+v 进入视图模式,竖着选择要添加的行的行首,按 I (大写字母 i )后输入//,按ESC
      2. 取消注释:按 Ctrl+v 进入视图模式,竖着选择要取消注释行的 // ,按d删除//即可
  8. 分屏

    1. 同时打开多个文件并分屏
      1. vim -O 文件名 文件名 …… :水平打开显示多个文件
      2. vim -o 文件名 文件名 …… :垂直打开显示多个文件
    2. 在编辑过程中,通过分屏打开新的文件【末行模式】
      1. sp 文件名:垂直打开/创建另一个文件
      2. vsp 文件名:水平打开/创建另一个文件
    3. 使用可分屏显示的终端

2.gcc

  1. 概述

    1. GCC 原名叫做 GNU C Compliler
    2. GNU:GNU is no Unix
    3. GCC 理解的误区:gcc 只能编译c代码,g++只能编译cpp程序。
      1. 如果你的程序是C文件,gcc 就会当做c文件编写,g++会把该文件当做cpp文件编译。
      2. 如果是CPP文件,gcc 和 g++ 都会当做 c++文件编写。
      3. g++在编译程序文件时,会先调用 gcc 进行编译,最后链接的时候使用 g++完成链接。
  2. gcc 重要选项

    1. 预处理:-E 条件编译,头文件展开,删除注释,生成扩展名 .i 的C文件
    2. 编译:-S 语法检查,生成扩展名为 .s 汇编文件
    3. 编译:-c 将汇编文件转换为二进制指令文件,生成扩展名为 .o 的目标文件
    4. 链接:寻找库代码,链接库代码,给程序添加启动代码
    5. -o 编译后的文件名
  3. 其他重要选项

    1. -g 生成调试信息,添加后可以使用 gdb 调试工具,例如:gcc -g main.c
    2. -w 不显示警告信息
    3. -Wall 显示全部警告信息
    4. -I(大写的字母 i )指定包含的头文件的路径
    5. -D 编译时指定一个宏定义、宏常量,例如:gcc main.c -D DEBUG
    6. -std 设置编译时的语言版本
      1. C: c89/c90、c99、c11
      2. C++90、c++11、C++17
      3. gcc -std=c90 main.c gcc -std=c99 main.c gcc -std=c++11 main.c
        g++ -std=c++11 main.c

3.静态库和动态库的制作和使用

库主要分为两类:静态库、动态库(共享库)。

  1. 静态库在编译的时候,需要将库中的代码拷贝到可执行文件中。动态库并不需要将代码拷贝可
    执行文件中,运行时,需要保证库的存在。
  2. 如果一个软件使用的静态库,那么当库更新时,整个程序都需要重新编译,对于用户而言,就
    需要重新下载程序安装。动态库相反。

1.静态库

  1. 命名规则:lib+静态库名+.a,例如:库名cal,libcal.a

  2. 静态库的制作过程:

    1. 先将 .c 代码编译成 .o 文件 : gcc -c *.c
    2. 将 .o 文件使用特殊的方式压缩到一起生成静态库文件:ar rcs 库的名字 *.o
      1. r 表示把.o文件插入库中
      2. c表示创建库文件
      3. s创建文件索引,创建较大的库时可以加快速度
    3. 查看库中的模块:ar -t 库名:ar -t libcal.a
  3. 静态库的使用:

    在静态库创建后,要将静态库和头文件一并交给用户

    1. 在源文件中包含头文件
    2. 在链接时指定静态库即可
    3. 例如:gcc main.c -o main -I include/ -lcal -L mylib/
    4. -l(小写字母 l)紧跟库名(区别lib和.a),-I 指定头文件路径,-L指定静态库库的路径
    5. 生成的可执行文件可以正常运行并输出结果则成功

2.动态库

动态库命名规则:lib+动态库名+.so

  1. 动态库的制作过程:

    1. 将 .c 文件编译成 .o 文件,生成与位置无关的代码:gcc -c *.c -fPIC -I include/
    2. 使用 .o 文件生成动态库:gcc -shared -o libcal.so *.o
    3. nm -D libcal.so 查看动态库的符号表
  2. 动态库的使用:

    1. 在源文件中包含头文件
    2. 源文件编译的时候要指定动态库:gcc main.c -I mylib/include/ -lcal -L mylib/
    3. 查看可执行程序所依赖的库:ldd 可执行程序,可以查看该可执行文件的依赖库有哪
      些,并且查看是否能够连接到。
    4. 编译的时候指定了动态库,只是检查动态库是否存在
    5. 程序运行时,必须告诉程序动态库在哪个目录下(即配置动态库路径),才能正常运行
  3. 配置动态库路径:

    1. 方法1:去环境变量:LD_LIBRARY_PATH 所保存的目录中查找动态库。

      1. 在终端执行命令: export LD_LIBRARY_PATH=/home/itcast/mylib:$LD_LIBRARY_PATH ,只会
        临时有效,下次登录进来该变量就会被删除。
      2. .bashrc 是用户的配置文件,该文件在每次登录时都会被执行一遍。在该文件中最
        后增加配置内容: export LD_LIBRARY_PATH=/home/itcast/mylib:$LD_LIBRARY_PATH ,然
        后使用 source ./.bashrc,使得该配置文件有效。
    2. 方法2:在另外一个文件中配置

    3. 在 /etc/ld.so.conf.d/ 目录中创建一个 任意名.conf 文件(需要root借用权限)

    4. 在该文件中写下动态库的绝对路径

    5. sudo ldconfig 使文件生效

    6. 动态库的默认搜索路径是:/lib /usr/lib。将动态库文件拷贝到这两个目录其中一个下亦可

4.gdb调试

GDB 是在 Unix Like 下的代码调试工具,可以使得代码单行调试。

使用前如未安装需要安装:sudo apt install gdb

  1. 调试前的准备工作:在调试前要对源文件进行编译形成可执行文件,且要让可执行文件包含调试信息,使用 gcc 的 -g 选项

    gcc -g -Wall main.c -o main

  2. 启动调试:gdb 可执行文件 ,只是准备开始调试,并未开始调试

  3. 添加断点和删除断点:

    1. 添加断点:break 可简写为 b 。break 行号、break 文件:行号、break 函数名
    2. 查看断点:info break 可简写为 i b
    3. 删除断点:delete 断点编号,可简写为 del 断点编号。clear 行号,clear 函数名。delete 删除所有断点
  4. 使程序运行起来,开始调试:

    1. run 执行到一个断点
    2. start 在程序的第一行添加一个断点,使程序停在第一行
    3. quit 退出调试
  5. 代码执行:

    1. 逐语句:step 可简写为 s , 遇到函数会进入函数,包括printf函数也会进入
    2. 逐过程:next 可简写为 n ,遇到函数不进入,直接执行
    3. 逐断点:continue 可简写为 c ,直接执行到下一个断点
    4. 跳出:finish 可简写为 fin,直接执行到函数结束并跳到上一级函数
    5. gdb 清屏:Ctrl+l (小写字母 l )
    6. 显示当前调试行前后的代码:list 可简写为 l
  6. 调试过程中查看变量的值

    1. print 变量名 ,打印变量当前的值

    2. print &变量名,打印变量的地址

    3. display 变量:对变量添加监控,代码执行一次,该变量的值就打印一次

    4. undisplay 变量编号:取消变量监控

    5. 查看监控变量编号:info display

带字符图形界面的gdb调试

  1. 启动调试gdbtui 可执行文件gdb -tui 可执行文件 进入调试界面
  2. 当调试的时候会出现:gdb 的输出和程序的输出占用同一个终端界面,导致字符界面扭曲。将
    gdb 和程序输出转向到另外一个终端窗口中即可。
    1. 首先,开启一个新的终端,并在终端中输入命令:tty,该命令会显示窗口标识。
    2. 在 run 和 start 执行之前,输入命令:tty 【另外一个窗口的标识】,将该窗口输出内容
      重定向到另外一个窗口。

猜你喜欢

转载自blog.csdn.net/qq_41775886/article/details/107369550