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 【另外一个窗口的标识】,将该窗口输出内容
      重定向到另外一个窗口。

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

  1. 【学习笔记】Linux 系统编程入门

    Linux 系统编程入门 静态库与动态库 静态库命名规则 静态库的制作 静态库使用 动态库制作 动态库使用 加载动态库 静态库的优缺点 动态库的优缺点 Makefile 文件命名 工作原理 变量 模式 ...

  2. 【Linux 系统编程】vim 的安装配置及使用

    2019独角兽企业重金招聘Python工程师标准>>> 转载请标明出处: http://blog.csdn.net/u011974987/article/details/527005 ...

  3. linux系统下编译安装gcc库

    概述 一般来说,gcc.g++为linux系统基础组件,不会需要升级,但在安装某些新软件时,需要c++17支持,此时就需要升级gcc.g++. g++包含在gcc库中,所以直接升级gcc即可. gcc ...

  4. Linux系统编程三:使用man查看帮助文档

    目录 一.概述 二.使用方法 三.手册分页 四.总结 一.概述 在前两篇延时时间和LED控制中,都用到了系统函数.随着学习深入,用到的函数越来越多,如何记住每个函数的原型和头文件?一些常用的函数随着印 ...

  5. Linux系统编程(三) --进程间通信

    文章目录 1 进程间通信总览 1.1 进程间如何通信 1.2 Linux IPC 分类 1.3 Linux IPC常用手段 2 无名管道 2.1 pipe 函数 2.2 用pipe进行进程间通信 3 ...

  6. alin的学习之路(Linux系统编程:五)(目录操作、进程相关概念)

    alin的学习之路(Linux系统编程:五)(目录操作.进程相关概念) 1. 目录操作 1. 查看工作目录 getcwd char *getcwd(char *buf, size_t size) 功能 ...

  7. alin的学习之路(Linux系统编程:一)(Linux基础命令)

    alin的学习之路(Linux系统编程:一)(Linux基础命令) 1.Linux学习准备 操作系统的作用 向上给用户提供简单的操作计算机硬件的方式 对下管理硬件 承上启下 程序运行在操作系统上,程序 ...

  8. alin的学习之路(Linux网络编程:一)(网络模型、帧格式、socket套接字、服务器端实现)

    alin的学习之路(Linux网络编程:一)(网络模型.帧格式.socket套接字.服务器端实现) 1. 协议 协议是一组规则,规定了如何发送数据.通信的双发都需要遵守该规则 2. 网络分层结构模型 ...

  9. alin的学习之路(Linux网络编程:十)(http协议,BS模型)

    alin的学习之路(Linux网络编程:十)(http协议,BS模型) 需求:使用B/S模型来访问主机中的文件(包括目录) 0. B/S 模型 注意事项 1. 浏览器请求ico ​ 准备一个favic ...

最新文章

  1. javascript 深度克隆
  2. java date 转换calendar_Java中日期格式(String、Date、Calendar)的相互转换
  3. TCPDUMP/LIBPCAP 3-PCAP 中文手册(1)
  4. android studio上下滚动菜单,Android模仿美团顶部的滑动菜单实例代码
  5. vbscript html 在线,在HTML中使用VBScript可用三种方法
  6. PAT甲题题解-1077. Kuchiguse (20)-找相同后缀
  7. 面向对象进阶4:软件开发规范
  8. git和github的基本使用
  9. 1.1 Storm集群安装部署步骤
  10. 单分支 两路分支和多分支的if结构_程序选择结构
  11. CLM 陆面过程模式
  12. 1602液晶引见(电路和引脚图)
  13. 青出于蓝而胜于蓝——揭秘全新的 HWSQL
  14. CSS之display用法
  15. DAX: 用SWITCH函数替换嵌套IF函数
  16. 判断设备是否是 iphone5
  17. 美国国土安全部试图商业化的八种网络安全新技术
  18. 华夏芯闪耀登场第四届“芯动北京“论坛
  19. 2022-2028全球视频监控软件行业调研及趋势分析报告
  20. 海外仓一件代发的优势有哪些?

热门文章

  1. JSON与实体类的转换
  2. 在Windows11上安装ubuntu版linux系统并实现桌面图形化(WSL)
  3. 你尝过被人误会的委屈吗?看完本篇…
  4. SpringBoot 2.0+ /springframwork 5 自带的websocket, 实现后台主动推消息给前端,及前端发消息给后台(全双工模式通信)
  5. 领导常说的这3种客套话,看似是夸你,其实是看你老实好忽悠
  6. unity敌人的巡逻
  7. 【eoe 特刊】Windows 8 第一期 -- C#基本语法---sqlite数据库的使用---ListView 滚动加载 ---等
  8. mysql 索引 full_Mysql FULLTEXT索引说明
  9. mysql创建库语句
  10. excel没有办法输入汉字和英文字母一输入就报错