alin的学习之路(Linux系统编程:三)(vim,gcc,库,gdb)
alin的学习之路(Linux系统编程:三)(vim,gcc,库,gdb)
1.vim的使用
vim有三种模式:命令模式,末行模式,编辑模式
光标的移动【命令模式】
- h 向左 ,j 向下,k 向上,l 向上
- 移动到行首:^ 移动到行末:$
- 移动到屏幕顶部:H 移动到屏幕中间:M 移动到屏幕底部:L
- 移动到文件顶部:gg 移动到文件底部:G
**自动调整格式:**G=gg
剪切粘贴【命令模式】
- dd剪切一行,p粘贴到光标所在的下一行
- ndd 剪切多行,p粘贴到光标所在的下一行
- 选中剪切
- 选中多行:大写 V 选中后按d剪切,p 粘贴到光标所在的下一行
- 选中多个字符:小写 v 选中后按d剪切,p 粘贴到光标所在的下一行
- 取消选中:ESC
撤销与反撤销【命令模式】
- 撤销:u
- 反撤销:Ctrl+r
拷贝粘贴【命令模式】
- yy 拷贝一行,p粘贴到光标所在的下一行
- nyy 拷贝多行,p粘贴到光标所在的下一行
- 选中拷贝
- 选中多行:大写 V 选中后按d剪切,p 粘贴到光标所在的下一行
- 选中多个字符:小写 v 选中后按d剪切,p 粘贴到光标所在的下一行
- 取消选中:ESC
查找替换【末行模式】
- 查找替换规则:{范围}s/{被替换内容}/{替换成为的内容}/替换标志
- 范围:行范围。表示:1,10 表示第一行到第10行,%表示整个文件,点(.)表示当前行
- 替换及被替换内容:字符串
- 替换标志:不写替换标志模式替换每行的第一个对应字符串,替换标志 g 表示替换每行的全部对应字符串
- 末行模式输入
noh+回车
取消高亮
- 查找替换规则:{范围}s/{被替换内容}/{替换成为的内容}/替换标志
代码注释【命令模式】
- 方法1:
- 添加注释:V 选中要添加注释的行,按gc完成添加注释
- 取消注释:V 选中要添加注释的行,按gc完成取消注释
- 方法2:
- 添加注释:按 Ctrl+v 进入视图模式,竖着选择要添加的行的行首,按 I (大写字母 i )后输入//,按ESC
- 取消注释:按 Ctrl+v 进入视图模式,竖着选择要取消注释行的 // ,按d删除//即可
- 方法1:
分屏
- 同时打开多个文件并分屏
- vim -O 文件名 文件名 …… :水平打开显示多个文件
- vim -o 文件名 文件名 …… :垂直打开显示多个文件
- 在编辑过程中,通过分屏打开新的文件【末行模式】
- sp 文件名:垂直打开/创建另一个文件
- vsp 文件名:水平打开/创建另一个文件
- 使用可分屏显示的终端
- 同时打开多个文件并分屏
2.gcc
概述
- GCC 原名叫做 GNU C Compliler
- GNU:GNU is no Unix
- GCC 理解的误区:gcc 只能编译c代码,g++只能编译cpp程序。
- 如果你的程序是C文件,gcc 就会当做c文件编写,g++会把该文件当做cpp文件编译。
- 如果是CPP文件,gcc 和 g++ 都会当做 c++文件编写。
- g++在编译程序文件时,会先调用 gcc 进行编译,最后链接的时候使用 g++完成链接。
gcc 重要选项
- 预处理:-E 条件编译,头文件展开,删除注释,生成扩展名 .i 的C文件
- 编译:-S 语法检查,生成扩展名为 .s 汇编文件
- 编译:-c 将汇编文件转换为二进制指令文件,生成扩展名为 .o 的目标文件
- 链接:寻找库代码,链接库代码,给程序添加启动代码
- -o 编译后的文件名
其他重要选项
- -g 生成调试信息,添加后可以使用 gdb 调试工具,例如:gcc -g main.c
- -w 不显示警告信息
- -Wall 显示全部警告信息
- -I(大写的字母 i )指定包含的头文件的路径
- -D 编译时指定一个宏定义、宏常量,例如:gcc main.c -D DEBUG
- -std 设置编译时的语言版本
- C: c89/c90、c99、c11
- C++90、c++11、C++17
- gcc -std=c90 main.c gcc -std=c99 main.c gcc -std=c++11 main.c
g++ -std=c++11 main.c
3.静态库和动态库的制作和使用
库主要分为两类:静态库、动态库(共享库)。
- 静态库在编译的时候,需要将库中的代码拷贝到可执行文件中。动态库并不需要将代码拷贝可
执行文件中,运行时,需要保证库的存在。 - 如果一个软件使用的静态库,那么当库更新时,整个程序都需要重新编译,对于用户而言,就
需要重新下载程序安装。动态库相反。
1.静态库
命名规则:lib+静态库名+.a,例如:库名cal,libcal.a
静态库的制作过程:
- 先将 .c 代码编译成 .o 文件 :
gcc -c *.c
- 将 .o 文件使用特殊的方式压缩到一起生成静态库文件:
ar rcs 库的名字 *.o
- r 表示把.o文件插入库中
- c表示创建库文件
- s创建文件索引,创建较大的库时可以加快速度
- 查看库中的模块:ar -t 库名:
ar -t libcal.a
- 先将 .c 代码编译成 .o 文件 :
静态库的使用:
在静态库创建后,要将静态库和头文件一并交给用户
- 在源文件中包含头文件
- 在链接时指定静态库即可
- 例如:
gcc main.c -o main -I include/ -lcal -L mylib/
- -l(小写字母 l)紧跟库名(区别lib和.a),-I 指定头文件路径,-L指定静态库库的路径
- 生成的可执行文件可以正常运行并输出结果则成功
2.动态库
动态库命名规则:lib+动态库名+.so
动态库的制作过程:
- 将 .c 文件编译成 .o 文件,生成与位置无关的代码:
gcc -c *.c -fPIC -I include/
- 使用 .o 文件生成动态库:
gcc -shared -o libcal.so *.o
- nm -D libcal.so 查看动态库的符号表
- 将 .c 文件编译成 .o 文件,生成与位置无关的代码:
动态库的使用:
- 在源文件中包含头文件
- 源文件编译的时候要指定动态库:
gcc main.c -I mylib/include/ -lcal -L mylib/
- 查看可执行程序所依赖的库:
ldd 可执行程序
,可以查看该可执行文件的依赖库有哪
些,并且查看是否能够连接到。 - 编译的时候指定了动态库,只是检查动态库是否存在
- 程序运行时,必须告诉程序动态库在哪个目录下(即配置动态库路径),才能正常运行
配置动态库路径:
方法1:去环境变量:LD_LIBRARY_PATH 所保存的目录中查找动态库。
- 在终端执行命令: export LD_LIBRARY_PATH=/home/itcast/mylib:$LD_LIBRARY_PATH ,只会
临时有效,下次登录进来该变量就会被删除。 - .bashrc 是用户的配置文件,该文件在每次登录时都会被执行一遍。在该文件中最
后增加配置内容: export LD_LIBRARY_PATH=/home/itcast/mylib:$LD_LIBRARY_PATH ,然
后使用 source ./.bashrc,使得该配置文件有效。
- 在终端执行命令: export LD_LIBRARY_PATH=/home/itcast/mylib:$LD_LIBRARY_PATH ,只会
方法2:在另外一个文件中配置
在 /etc/ld.so.conf.d/ 目录中创建一个 任意名.conf 文件(需要root借用权限)
在该文件中写下动态库的绝对路径
sudo ldconfig 使文件生效
动态库的默认搜索路径是:/lib /usr/lib。将动态库文件拷贝到这两个目录其中一个下亦可
4.gdb调试
GDB 是在 Unix Like 下的代码调试工具,可以使得代码单行调试。
使用前如未安装需要安装:sudo apt install gdb
调试前的准备工作:在调试前要对源文件进行编译形成可执行文件,且要让可执行文件包含调试信息,使用 gcc 的 -g 选项
gcc -g -Wall main.c -o main
启动调试:
gdb 可执行文件
,只是准备开始调试,并未开始调试添加断点和删除断点:
- 添加断点:break 可简写为 b 。break 行号、break 文件:行号、break 函数名
- 查看断点:info break 可简写为
i b
- 删除断点:delete 断点编号,可简写为 del 断点编号。clear 行号,clear 函数名。delete 删除所有断点
使程序运行起来,开始调试:
- run 执行到一个断点
- start 在程序的第一行添加一个断点,使程序停在第一行
- quit 退出调试
代码执行:
- 逐语句:step 可简写为 s , 遇到函数会进入函数,包括printf函数也会进入
- 逐过程:next 可简写为 n ,遇到函数不进入,直接执行
- 逐断点:continue 可简写为 c ,直接执行到下一个断点
- 跳出:finish 可简写为 fin,直接执行到函数结束并跳到上一级函数
- gdb 清屏:Ctrl+l (小写字母 l )
- 显示当前调试行前后的代码:list 可简写为 l
调试过程中查看变量的值
print 变量名 ,打印变量当前的值
print &变量名,打印变量的地址
display 变量:对变量添加监控,代码执行一次,该变量的值就打印一次
undisplay 变量编号:取消变量监控
查看监控变量编号:info display
带字符图形界面的gdb调试
- 启动调试
gdbtui 可执行文件
或gdb -tui 可执行文件
进入调试界面 - 当调试的时候会出现:gdb 的输出和程序的输出占用同一个终端界面,导致字符界面扭曲。将
gdb 和程序输出转向到另外一个终端窗口中即可。- 首先,开启一个新的终端,并在终端中输入命令:tty,该命令会显示窗口标识。
- 在 run 和 start 执行之前,输入命令:tty 【另外一个窗口的标识】,将该窗口输出内容
重定向到另外一个窗口。
alin的学习之路(Linux系统编程:三)(vim,gcc,库,gdb)相关推荐
- 【学习笔记】Linux 系统编程入门
Linux 系统编程入门 静态库与动态库 静态库命名规则 静态库的制作 静态库使用 动态库制作 动态库使用 加载动态库 静态库的优缺点 动态库的优缺点 Makefile 文件命名 工作原理 变量 模式 ...
- 【Linux 系统编程】vim 的安装配置及使用
2019独角兽企业重金招聘Python工程师标准>>> 转载请标明出处: http://blog.csdn.net/u011974987/article/details/527005 ...
- linux系统下编译安装gcc库
概述 一般来说,gcc.g++为linux系统基础组件,不会需要升级,但在安装某些新软件时,需要c++17支持,此时就需要升级gcc.g++. g++包含在gcc库中,所以直接升级gcc即可. gcc ...
- Linux系统编程三:使用man查看帮助文档
目录 一.概述 二.使用方法 三.手册分页 四.总结 一.概述 在前两篇延时时间和LED控制中,都用到了系统函数.随着学习深入,用到的函数越来越多,如何记住每个函数的原型和头文件?一些常用的函数随着印 ...
- Linux系统编程(三) --进程间通信
文章目录 1 进程间通信总览 1.1 进程间如何通信 1.2 Linux IPC 分类 1.3 Linux IPC常用手段 2 无名管道 2.1 pipe 函数 2.2 用pipe进行进程间通信 3 ...
- alin的学习之路(Linux系统编程:五)(目录操作、进程相关概念)
alin的学习之路(Linux系统编程:五)(目录操作.进程相关概念) 1. 目录操作 1. 查看工作目录 getcwd char *getcwd(char *buf, size_t size) 功能 ...
- alin的学习之路(Linux系统编程:一)(Linux基础命令)
alin的学习之路(Linux系统编程:一)(Linux基础命令) 1.Linux学习准备 操作系统的作用 向上给用户提供简单的操作计算机硬件的方式 对下管理硬件 承上启下 程序运行在操作系统上,程序 ...
- alin的学习之路(Linux网络编程:一)(网络模型、帧格式、socket套接字、服务器端实现)
alin的学习之路(Linux网络编程:一)(网络模型.帧格式.socket套接字.服务器端实现) 1. 协议 协议是一组规则,规定了如何发送数据.通信的双发都需要遵守该规则 2. 网络分层结构模型 ...
- alin的学习之路(Linux网络编程:十)(http协议,BS模型)
alin的学习之路(Linux网络编程:十)(http协议,BS模型) 需求:使用B/S模型来访问主机中的文件(包括目录) 0. B/S 模型 注意事项 1. 浏览器请求ico 准备一个favic ...
最新文章
- javascript 深度克隆
- java date 转换calendar_Java中日期格式(String、Date、Calendar)的相互转换
- TCPDUMP/LIBPCAP 3-PCAP 中文手册(1)
- android studio上下滚动菜单,Android模仿美团顶部的滑动菜单实例代码
- vbscript html 在线,在HTML中使用VBScript可用三种方法
- PAT甲题题解-1077. Kuchiguse (20)-找相同后缀
- 面向对象进阶4:软件开发规范
- git和github的基本使用
- 1.1 Storm集群安装部署步骤
- 单分支 两路分支和多分支的if结构_程序选择结构
- CLM 陆面过程模式
- 1602液晶引见(电路和引脚图)
- 青出于蓝而胜于蓝——揭秘全新的 HWSQL
- CSS之display用法
- DAX: 用SWITCH函数替换嵌套IF函数
- 判断设备是否是 iphone5
- 美国国土安全部试图商业化的八种网络安全新技术
- 华夏芯闪耀登场第四届“芯动北京“论坛
- 2022-2028全球视频监控软件行业调研及趋势分析报告
- 海外仓一件代发的优势有哪些?
热门文章
- JSON与实体类的转换
- 在Windows11上安装ubuntu版linux系统并实现桌面图形化(WSL)
- 你尝过被人误会的委屈吗?看完本篇…
- SpringBoot 2.0+ /springframwork 5 自带的websocket, 实现后台主动推消息给前端,及前端发消息给后台(全双工模式通信)
- 领导常说的这3种客套话,看似是夸你,其实是看你老实好忽悠
- unity敌人的巡逻
- 【eoe 特刊】Windows 8 第一期 -- C#基本语法---sqlite数据库的使用---ListView 滚动加载 ---等
- mysql 索引 full_Mysql FULLTEXT索引说明
- mysql创建库语句
- excel没有办法输入汉字和英文字母一输入就报错