linux三尖刀
序
我们都知道,一个可执行程序的基本的生命过程是如此的:
(编辑)源文件--->(编译)目标文件--->(链接)可执行文件--->(调试排错)稳定执行
所以,在这个过程中,我们很容易看得出。一个程序开发过程是离不开,编辑器,编译器,调试器这三个工具的。
那么vim,gcc(g++),gdb就是linux环境C/C++编程三把尖刀,没有他们的存在,江湖总是太过平静了。
修习之剑vim
vim模式:
基本分类
①插入模式(可编辑,输入字符状态),②命令模式(底行模式),③视图模式(v进入,可选定字符)
详细分化
1.通常模式(n) 在其它任何一个模式下,用ESC或者 ctrl+c 键可以退到通常模式
2.插入模式(i) 在这个模式下,vim像一个常见的编辑器.在通常模式下,用i或者a可以进行本模式,当然,还有一些其它命令也可以.
3.可视模式(v) 在这个模式下,可以使用hjkl进行选择.然后进行copy,paste或者其它操作. 在通常模式下,用v命令进行可视模式.
4.块操作模式(V) 这是块操作模式. 在通常模式下,用ctrl+v进入本模式.
5.修改模式(R) 这是改写的模式.很多软件法用insert键来完成这个切换.在vim中,从通常模式用R即可进入改写模式.
6.扩展命令模式(ex) 这是命令执行模式 在通常模式下用:切换到此模式
模式切换:
模式下操作
普通模式下:
跳转
到行末 $
到行首 ^
到文件开始 gg
到文件最后 G
到第n行 nG
---以字符/行为单位跳转
光标移动 方向 h左 j下 k上 l右
---以单词为单位跳转
上一个单词b 下一个单词w 本单词末尾e
删除
删除光标下字符:向后x(同插入模式下的del键) 向前X(同插入模式下的Backspace键)
向前或者向后删除一个字符也可以: 按d 按左右键
向前或者向后删除两行:按d 按上下键
删除光标所在行dd
删除光标所在单词dw
删除多行或者多个单词 ndd ndw
替换单个字符(将源字符替换为x) rx
将光标所在字符大小写转换 ~
复制粘贴
复制行 yy
复制单词 yw(不忽略空格,连续空格算做一个单词)
复制n个单词、行:nyy nyw
粘贴pp 多次粘贴npp
替换模式操作:
普通模式输入R进入之后操作(同插入模式下ins键)
视图模式操作:
普通模式按v进入
eg删除3个字符
①进入v模式,方向选取3个字符
②按x或者d删除之
eg 替换几个字符为sss
①可视模式选取字符
②按r 按s 就将选定的字符都换位s字符了
命令模式:
①:进入命令模式
②输入命令
③按下enter执行操作
主要命令有:
环境设置eg
set number 显示行号
set nonnumber 取消显示行号
set tabstop=2 设置tab键等价空格数
set shifwidth=2设置缩进为2个空格
更多设置请在命令模式下输入:help去学习
ps:将更多合适的 环境设置聚合在配置文件.vimrc中保持vim编辑器个性化
块模式下操作:
最常用用法-->>注释一段代码
ps,当我们不熟悉块操作之时,要注释一段代码,貌似只能在插入模式下一行一行的插入//
这么做,很是低效费事。
块模式注释一段代码:
①按CTRL+V进入块模式
②方向键选取需要注释的行数
③按下I进入插入模式
④输入//
⑤按esc退出
至此,注释完成,ps模块模式的做法是,对应选取的块,以行为单位,每个行都按格式进行操作
取消注释:
进入块模式后,用x或者d删除一行中的字符,按esc退出。这里就不上图了
锻造之剑gcc/g++
①man了解基本选项
解释:
-E 预处理过程,得到.i文件,保存宏替换,条件编译处理之后的文件
-S 编译过程,获得汇编代码.s
-c获取目标文件
-o获取输出文件,一般用于指定可执行文件。(中间生成文件也可以使用之指定filename)
一个命令获取以上过程文件
gcc test.c -save-temps
注:gcc、g++默认是动态链接的,
指定为静态链接的参数 -static
更多选项(相关问题请参考linux环境编程相关章节)
生成静态链接库
ar -rcs test.a test.o
使用静态链接库
gcc -o test main.c libstr.a
或者 “-l 库名”
gcc -o test main.c -lstr
指定静态库路径
gcc -o test main.c -L ./ -lstr
生成动态库
gcc -shared -Wl, -soname,libstr.so -o libstr.so.l string.c
//-soname,libstr.so 表示生成动态库别名为libstr.so
//-o libstr.so.l 实际动态链接库文件
//-shared 表示生成的是一个动态链接文库
配置文件 /etc/ld.so.conf
ldconfig -g显示动态链接库列表(缓存文件中的)
ldconfig 目录名 将该目录中动态链接库放入系统缓存文件/etc/ld.so.cache
使用(同静态链接库的使用)
gcc -o test main.c -L ./ -lstr
锤炼之剑gdb
最后我们来看看gdb的使用了
基本功能
①设置断点b
②显示变量print
③单步执行 s(f11) n(f10) u(shift+f11)
④运行时修改变量值
⑤路径跟踪,堆栈调用展开bt
⑥线程切换
info thread 获取线程信息
thread id 进入调试线程
简单使用步骤
①编译程序加入选项-g
gcc test.c -g
②调试可执行程序
gdb a.out
进入之后
当程序需要命令行参数时
③(可选)set args 参数值1 参数值2 参数值3
④显示源代码l (list 简写)
⑤断点设置b main(breakpointer简写)可以设置断点在行号,函数名,条件设置等
eg b 36 if i==2 当i==2时断点
⑥执行 r (run)执行到断点处停止
打印变量p value (print value)
监视变量display value (每次enter都会打印)
其他命令
断点失效:
enable b 编号
i 打印信息
info显示 eg
info b 显示断点信息
file path 加载文件
变量类型检测 whatis value
最后说一个命令,也就是上图中的调试过程中显示的代码框架
refresh
最后,关于linux下的makefile下次再解
linux三尖刀的更多相关文章
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- Linux 内核概述 - Linux Kernel
Linux 内核学习笔记整理. Unix unix 已有40历史,但计算机科学家仍认为其是现存操作系统中最大和最优秀的系统,它已成为一种传奇的存在,历经时间的考验却依然声名不坠. 1973 年,在用 ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
- NodeJs在Linux下使用的各种问题
环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...
- [linux]阿里云主机的免登陆安全SSH配置与思考
公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...
- Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级
Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...
- Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作
Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...
- SQL Server on Linux 理由浅析
SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...
- Microsoft Loves Linux
微软新任CEO纳德拉提出的“Microsoft Loves Linux”,并且微软宣布.NET框架的开源,近期Microsoft不但宣布了Linux平台的SQL Server,还宣布了Microsof ...
随机推荐
- 使用colmap进行稠密重建
colmap应该是目前state-of-art的增量式SFM方案,可以方便的对一系列二维图片进行三维重建 不用对摄像机进行标定,只需要从不同角度对重建场景或物体进行拍摄得到一系列图像作为输入 首先需要 ...
- network command assistant
这篇文章收集了久经考验靠谱的命令,也收集了几个比较新的命令.多数命令都可以在图形桌面执行,即使是没什么终端使用经验的Linux用户也会常常执行命令来使用ping或是其它的网络诊断工具. 1.curl ...
- scrapy爬虫系列之六--模拟登录
功能点:如何发送携带cookie访问登录后的页面,如何发送post请求登录 爬取网站:bilibili.github 完整代码:https://files.cnblogs.com/files/book ...
- Warm up---hdu4612(缩点,树的直径)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 给一个无向图, 加上一条边后,求桥最少有几个: 那我们加的那条边的两个顶点u,v:一定是u,v之 ...
- centos设置代理上网
centos设置代理上网 假设我们要设置代理为 IP:PORT 1.网页上网 网页上网设置代理很简单,在firefox浏览器下 Edit-->>Preferences-->> ...
- 20165207 学习基础与C语言基础调查反馈
文章阅读体会与学习调查反馈 文章阅读体会 我在娄老师的文章里了解到了"做中学"的概念.并且通过娄老师慷慨地分享的相关经验,我对于它有了进一步的理解以及体会.以下是我收获以及我的感想 ...
- TED #06# Questioning the universe
Stephen Hawking: Questioning the universe 1. 第一段: There is nothing bigger or older than the universe ...
- Linux及安全实践二
Linux及安全实践二 基本内核模块 20135238 龚睿 1. 理解模块原理 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个 ...
- 参考sectools,每个人至少查找5种安全工具、库等信息并深入研究至少两种并写出使用教程
1.Nessus Nessus是免费网络漏洞扫描器,它可以运行于几乎所有的UNIX平台之上.它不仅能永久升级,还免费提供多达11000种插件(但需要注册并接受EULA-acceptance--终端用户 ...
- 20155201 实验二《Java面向对象程序设计》实验报告
20155201 实验二<Java面向对象程序设计>实验报告 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. ...