Vi编辑器
- vi+文件名 进入命令模式
• n+空格,光标向右移动n格;n+回车,光标向下移动n行
• 0/home 移动到本行最前面字符;$/end 移到本行最后一个字符
• G移动到文件最后一行,nG移动到第n行;gg移动到第一行
• X删除光标前一个字符,x删除光标所在字符
• nx连续向后删除n个字符
• dd删除光标所在整行,ndd删除光标所在的向下n行
• d0删除光标到该行第一个字符
• yy复制光标所在行,nyy复制光标所在向下n行
• p将复制的东西粘贴在光标下一行,P粘贴在光标上一行
• J把光标所在行和下一行合成一行
• U复原前一个动作 - 插入模式
• i为从当前光标所在处插入,I为从所在行的第一个非空格字符插入
• a为从目前光标所在处的下一个字符插入,A为光标所在行的最后一个字符处开始插入
• o目前光标所在行的下一行插入新的一行,O目前光标所在行的上一行插入新的一行
• 进入取代模式(Replace mode): r只会取代光标所在的那一个字符一 次;R会一直取代光标所在的文字,直到按下ESC为止;
• i, o,R三个按钮即可!尤其是新增一行的o与取代的R - 底行模式
• 命令模式+“:”“?”"/"可以切换至底行模式
• /word 向光标之下寻找word;?word向光标之上寻找word
• :n1,n2s/word1/word2/g 在n1到n2行之间找到word1并替换成word2
• :1, s / w o r d 1 / w o r d 2 / g , 从 第 一 行 到 最 后 一 行 找 到 w o r d 1 并 替 换 成 w o r d 2 • : 1 , s/word1/word2/g,从第一行到最后一行找到word1并替换成word2 • :1, s/word1/word2/g,从第一行到最后一行找到word1并替换成word2•:1,s/word1/word2/gc,替换前请求用户确认
• set nu 设置行号,set nonu 取消行号
• w保存,q退出,w+文件名,表示另存为 - vi文件的暂存
• vi编辑文件时,会在编辑文件所在的文件夹下生成.filename.swap。 记录了对文件的操作。若vi编辑器非正常退出、掉线,则可用该文件进行救援 - vi编辑器扩展功能
• 区块选择:v会将光标经过的地方反白选择;V行选择,会将光标经过的行反白选择;Ctrl+v区块选择,用长方形方式选择文件
• 多文本编辑::n编辑下一个文件,:N编辑上一个文件,:files列出打开的所有文件
• 多窗口功能:先打开一个文件,后输入命令sp filename 。ctrl+w+上/下切换到上一个或下一个文件 - vi编辑器常用设置
• 使用vi编辑器会在家目录下生成~/.viminfo文件,记录访问位置、搜索记录等
• set all 可以查看所有环境的变量
• 配置文件/etc/vimrc)
GCC概述
- 基本语法
• -g包含调试信息;-E生成预处理文件;-c只编译子程序;-o产生目标文件;-I<>指定头文件路径 - 编译流程:
• hello.c——gcc -E(预处理)——hello.i——gcc -S(编译器gcc)——hello.s——gcc -c(编译器as)——hello.o——gcc(链接器ld)——a.out
• 预处理:gcc -E -o [目标文件] [编译文件](处理文件中的#ifdef,#include和#define等预处理命令
• 编译阶段:gcc -S -o [目标文件] [编译文件](检查语法错误)
• 汇编阶段:gcc -c -o [目标文件] [编译文件](生成二进制机器代码)
• 连接阶段:gcc -o [目标文件][编译文件] gcc test.o -o test生成test可执行文件,./test执行
• 直接编译:gcc test.c -o test
• 多文件同时编译:gcc 1.c 2.c 3.c -o test/gcc -c 1.c -o 1.o ,gcc -c 2.c -o 2.c——gcc 1.o 2.o -o test
• gcc默认在当前目录(子目录也不行)和/usr/include目录下查找相应的头文件(.h文件),若找不到则报错
静态库与动态库
- Linux库文件名:lib+库名+后缀(静态.a;动态.so)
- 静态库动态库区别:
• 静态库的代码在编译时就拷⻉到应⽤程序中,因此当有多个程序同时引⽤⼀个静态库函数时,内存中将会调⽤函数的多个副本。由于是完全拷⻉,因此⼀旦连接成功,静态库就不再需要了,代码体积⼤。
• 动态库在程序内留下⼀个标记,指明当程序执⾏时,⾸先必须要载⼊这些库,在程序开始运⾏后调⽤库函数时才被载⼊,被调⽤函数在内存中只有⼀个副本,代码体积⼩ - 静态库的创建
• 1.在一个头文件(.h文件)中声明静态库所导出的函数
• 2.在一个源文件中实现静态库所导出的函数
• 3.编译源文件,生成目标文件(*.o)
• 4.通过命令ar将目标文件加入到某个静态库中 ar rcs 静态库名 目标文件列表
• 5.将静态库拷贝到系统默认的存放库文件的目录或指定目录下 - gcc –o test test.c –lother1 –lother2 装载名为libother1.a和libother2.a的静态库
- -L指定静态库的路径,-l指定头文件的路径(大写i)
- 动态库创建时产生的是与位置无关的目标文件(.o文件)
• 创建动态库 gcc -shared -o libdy.so *.o 生成libdy.so动态库 - 动态库的使用
8. 解决找不到链接库的方法
分布式版本控制系统git
- git int,创建库, git add 把文件加入暂存区
- git commit 把文件提交到当前分支
- git status 查看状态
- git log查看提交记录
- 回退:
• git reset –-hard HEAD^ # 退回后新的不存在了,若git log还存在可用版本号回退
• git reset –-hard 版本号(来自git log)
• git reflog # 记录每一次更改,可找到最新版本 - 撤销修改(删除)
• git checkout – filename ,回到最近一次git commit或git add时的状态。 若未放到暂存区,回到和版本库一样的状态 ,放到暂存区,则回到添加到暂存区后的状态
• Git reset HEAD filename:撤销暂存区中的内容(git add)
• git rm filename:删除提交到版本库中的文件 (错删,则git checkout – filename 从版本库恢复) - 远程克隆
• 远程有项目组其他人上传的项目,或开源项目,需要克隆到本地开发。
• 步骤:git clone git@github.com:Coder-Peng/repo_git.git - 分支管理
• 创建分支: git checkout -b newbranch
• 查看当前分支:git branch
• 返回master分支: git checkout master
• 合并分支: git merge newbranch - 冲突管理:多分支修改相同文件,合并时会产生冲突,必须手动解决冲突,提交解决冲突后的文件,删除新分支
GDB(非重点)
- . 启动方式:gdb 程序名;gdb -q后再用file加载程序名;
- gcc –g testgdb.c –o test 要使用gdb进行调试的程序,在编译时需要添加-g 选项
- 退出:(gdb)quit (q)
- List
• list: 输出从上次调用list命令开始往后的10行程序代码,若再
• 次运行该命令则显示接下来的10行代码
• list -(减号):输出从上次调用list命令开始往前的10行代码
• list n:输出n行附近的10行代码
• list function:输出函数funciton附近的10行代码
• list 5,10:显示第5到第10行的代码 - forward/search:从当前行向后查找某个字符串的程序行,查找时不包括当前行,可以用list n,n,将当前行设置为n。
- reverse-search 字符串:从当前行向前查找第一个匹配的字符串。
- 使用gdb test或file test 只是装入程序,程序并没有运行 . 运行 (gdb) run
- 设置断点:break n到n行暂停,第n行不执行;break 函数名,停在函数第一行;break 6 if i==99执行到第六行,如果i为99,暂停;watch 条件表达式,必须在运行过程中设置观察,且表达式中的变量已经使用过
- 查看当前设置的断点 info breakpoints keep:生效一次后不失效 y:是否有效
- 使中断失效或有效
• 失效:disable 断点编号
• 有效:enable 断点编号 - 删除断点
• clear 行号:删除此行断点
• delete:删除程序中所有断点
• delete 断点编号:删除指定编号的断点,若一次要删除多个断点,各 个断点编号以空格隔开 - print i打印i,print i=20给i赋值
- whatis i显示i的数据类型
- set variable 变量=值 给变量赋值
- continue 程序继续运行,直到下一个断点或运行完为止
- kill 结束当前程序的调试
- next和step
• 功能:一次一条执行该程序代码
• 区别:next把函数调用当作一条语句来执行 ,step跟踪进入函数,一次一条地执行函数内的代码 - help +类名 查看帮助文档
• breakpoints – Making program stop at certain points
• files – Specifying and examining files
• running – Running the program
Make(重点)
- 功能:通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。
- makefile文件可以改名:make -f rules.txt/make --file=rules.txt
- : # ⽬标: 前置条件
- [tab] # [必须有个table键] <命令>
- PHONY:clean声明clean是个伪目标
- 每⾏命令之前必须有⼀个tab键。如果想⽤其它键,可以⽤内置变量.RECIPEPREFIX声明。 例:.RECIPEPREFIX=> , ⽤.RECIPEPREFIX指定⼤于号(>)替代tab键
- 每⾏命令都是在⼀个单独运⾏的Shell中执⾏的,这些Shell间没有继承关系
- 解决⽅法: (1) ; 2) \ # “;”后可以换行 (3) .ONESHELL