Vim编辑器
Vim 仅仅通过键盘来在插入和执行命令等多种模式之间切换。这使得Vim可以不用进行菜单或者鼠标操作,并且最小化组合键的操作,对文字录入员或者程序员可以大大增强速度和效率。
CHAPTER 1.VIM快速入门
一、Vim的六种基本模式
1.普通模式
Vim的普通模式用的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式,而不是大多数编辑器的插入模式。
普通模式命令往往需要一个操作符结尾。
普通模式进入插入模式的方法:a键(append/追加)键或者i(insert/插入)键。
2.插入模式
在这个模式中,大多数按键都会向文本缓冲中插入文本。大多数新用户希望文本编辑器编辑过程中一直保持这个模式。
插入模式中回到普通模式:ESC键。
3.可视模式
与普通模式类似,但移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。
4.选择模式
这个模式中,可以用鼠标或者光标键高亮选择文本。
如果输入任何字符,Vim会用这个字符替换选择的高亮文本块,并且自动进入插入模式。
5.命令行模式
在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。
在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。
6.Ex模式(Ex mode)
这和命令行模式比较相似,在使用:visual命令离开Ex模式前,可以一次执行多条命令。
※三种常用模式的切换:
常用模式:普通模式、插入模式和命令行模式。
普通→插入: i 或 a
插入→普通: Esc 或 Ctrl + [
普通→命令行: :
命令行→普通:Esc 或 Ctrl + [
命令行模式下输入wq ,回车后保存并退出。
二、进入Vim
1.使用vim命令进入vim界面
(1)vim后面加上你要打开的已存在的文件名,或者不存在的文件名作为新建文件。
$ vim practice_1.txt
(2)直接使用vim也可以打开vim编辑器,但是不会打开任何文件。
$ vim
(3)进入命令行模式后输入:e 文件路径 同样可以打开相应文件。
2.游标移动
在进入vim后,按下i键进入插入模式,在该模式下可以输入文本信息;按Esc进入普通模式,在该模式下使用方向键或者h,j,k,l键可以移动游标。
具体按键如下:
h 左
l 右(小写L)
j 下
k 上
w 移动到下一个单词
b 移动到上一个单词
三、进入插入模式
在普通模式下使用下面的键将进入插入模式,并可以从相应的位置开始输入。具体按键对应如下:
i 在当前光标处进行编辑
I 在行首插入
A 在行末插入
a 在光标后插入编辑
o 在当前行后插入一个新行
O 在当前行前插入一个新行
cw 替换从光标所在位置后到一个单词结尾的字符
※每次要先回到普通模式才能切换成以不同的方式进入插入模式
四、保存文档
命令行模式下保存文档
(1)从普通模式输入:进入命令行模式,输入w回车,保存文档。
(2)输入:w 文件名可以将文档另存为其他文件名或存到其它路径下.
五、退出vim
1.命令行模式下退出vim
从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑
以下为其它几种退出方式:
:q! 强制退出,不保存
:q 退出
:wq! 强制保存并退出
:w <文件路径> 另存为
:saveas 文件路径 另存为
:x 保存并退出
:wq 保存并退出
2.普通模式下退出vim
普通模式下输入Shift+zz即可保存退出vim
六、删除文本
1.普通模式下删除vim文本信息
进入普通模式,使用下列命令可以进行文本快速删除:
x 删除游标所在的字符
X 删除游标所在前一个字符
Delete 同x
dd 删除整行
dw 删除一个单词(不适用中文)
d$或D 删除至行尾
d^ 删除至行首
dG 删除到文档结尾处
d1G 删至文档首部
CHAPTER 2. VIM文档编辑
一、vim重复命令
1.重复执行上次命令
在普通模式下.(小数点)表示重复上一次的命令操作。
2.执行指定次数相同的命令
进入普通模式输入N
在普通模式下, dw或者daw(delete a word)删除一个单词,所以dnw(n替换为相应数字)表示删除n个单词
二、游标的快速跳转
普通模式下,下列命令可以让光标快速调转到指定位置,我们分别讨论快速实现行间跳转和行内跳转
1.行间跳转
- nG(n Shift+g) 游标移动到第 n 行
- gg 游标移动到到第一行
- G(Shift+g) 到最后一行
※ 小技巧:Ctrl+o快速回到上一次(跳转前)光标所在位置
2.行内跳转
普通模式下使用下列命令在行内按照单词为单位进行跳转
w 到下一个单词的开头
e 到下一个单词的结尾
b 到前一个单词的开头
ge 到前一个单词的结尾
0或^ 到行头
$ 到行尾
f<字母> 向后搜索<字母>并跳转到第一个匹配的位置(非常实用)
F<字母> 向前搜索<字母>并跳转到第一个匹配的位置
t<字母> 向后搜索<字母>并跳转到第一个匹配位置之前的一个字母(不常用)
T<字母> 向前搜索<字母>并跳转到第一个匹配位置之后的一个字母(不常用)
※ ~可以将游标所在字母转换大小写
三、复制粘贴和剪切
1.复制及粘贴文本(普通模式中)
-
复制——y
yy复制游标所在的整行(3yy表示复制3行)
y^ 复制至行首,或y0。不含光标所在处字符。
y$ 复制至行尾。含光所在处字符。
yw 复制一个单词。
y2w 复制两个单词。
yG 复制至文本末。
y1G 复制至文本开头。 -
粘贴——p
p(小写)代表粘贴至光标后(下)
P(大写)代表粘贴至光标前(上)
2.剪切及粘贴
dd删除命令就是剪切,剪切后就可以使用p来粘贴。
※实用功能:交换上下行——ddp,快速交换光标所在行与它下面的行。
CHAPTER3 查找替换
一、字符的替换及撤销(Undo操作)
替换和Undo命令都是针对普通模式下的操作
1) r+<待替换字母> 将游标所在字母替换为指定字母
2) R 连续替换,直到按下Esc
3) cc 替换整行,即删除游标所在行,并进入插入模式
4) cw 替换一个单词,即删除一个单词,并进入插入模式
5) C(大写) 替换游标以后至行末
6) ~ 反转游标所在字母大小写
7) u{n} 撤销一次或n次操作
8) U(大写) 撤销当前行的所有修改
9) Ctrl+r redo,即撤销undo的操作
二、快速缩进
1.使用命令进行快速调整缩进操作(普通模式下)
>> 整行将向右缩进(使用,用于格式化代码超爽)
<< 整行向左回退
: 进入命令行模式下对shiftwidth值进行设置可以控制缩进和回退的字符数
2.shiftwidth命令
shiftwidth命令是指上一节>>命令产生的缩进(可以简写成sw), 普通模式下输入:进入命令行模式下对shiftwidth值进行设置,可以控制缩进和回退的字符数。
1) 获取目前的设定值
:set shiftwidth?
2) 设置缩进为10个字符
:set shiftwidth=10
3.调整文本位置(命令行模式下)
1) :ce(center) 使本行内容居中
2) :ri(right) 使本行文本靠右
3) :le(left) 使本行内容靠左
三、查找
1.快速查找(普通模式下)
a) 输入 / 然后键入需要查找的字符串 按回车后就会进行查找。
b) ?与/功能相同,只不过?是向上而/是向下查找。
c) 进入查找之后,输入n和N可以继续查找 n表示继续查找,N反向查找。
2.高级查找(普通模式下)
a) *寻找游标所在处的单词
b) #同上,但 * 是向前(上)找,#则是向后(下)找
c) g*同* ,但部分符合该单词即可
d) g#同# ,但部分符合该单词即可
※以上查找n,N 的继续查找命令依然可以用
CHAPTER4 高级功能入门
一、多文件编辑
1.使用vim编辑多个文件
编辑多个文件有两种形式,一种是在进入vim前使用的参数就是多个文件。另一种就是进入vim后再编辑其他的文件。
如果
同时创建两个新文件并编辑:
$ vim 1.txt 2.txt
命令行模式下输入:n编辑2.txt文件,可以加!即:n!强制切换,之前一个文件的输入没有保存,仅仅切换到另一个文件
命令行模式下输入:N编辑1.txt文件,可以加!即:N!强制切换,之前文件内的输入没有保存,仅仅是切换到另一个文件
即加!为强制切换不保存。
2.进入vim后打开新文件(命令行模式)
1) e 3.txt 打开新文件3.txt
2) e# 回到前一个文件
3) ls可以列出以前编辑过的文档
4) b 2.txt(或者编号)可以直接进入文件2.txt编辑
5) bd 2.txt(或者编号)可以删除以前编辑过的列表中的文件项目
6) e! 4.txt,新打开文件4.txt,放弃正在编辑的文件
7) f 显示正在编辑的文件名
8) f new.txt,改变正在编辑的文件名字为new.txt
3.恢复文件
如果因为断电等原因造成文档没有保存,可以采用恢复方式,vim -r进入文档后,输入:
ewcover 1.txt
来恢复
二、可视模式命令简介(普通模式)
1. v(小写) 进入字符选择模式,就可以移动光标,光标走过的地方就会选取。再次按下v会后就会取消选取。
2. Shift+v(小写) 进入行选择模式,按下V之后就会把整行选取,您可以上下移动光标选更多的行,同样,再按一次Shift+v就可以取消选取。
3. Ctrl+v(小写) 这是区域选择模式,可以进行矩形区域选择,再按一次Ctrl+v取消选取。
4. d 删除选取区域内容
5. y 复制选取区域内容
三、视窗操作简介
(1)命令行模式下
:new打开一个新的vim视窗,并进入视窗编辑一个新文件
:sp 1.txt 打开新的横向视窗来编辑1.txt
:vsp 2.txt 打开新的纵向视窗来编辑1.txt
(2)普通模式下
Ctrl+w打开一个新的vim视窗,并进入视窗编辑一个新文件
Ctrl-w s 将当前窗口分割成两个水平的窗口
Ctrl-w v 将当前窗口分割成两个垂直的窗口
Ctrl-w q 即 :q 结束分割出来的视窗。如果在新视窗中有输入需要使用强制符!即:q!
Ctrl-w o 打开一个视窗并且隐藏之前的所有视窗
Ctrl-w j 移至下面视窗
Ctrl-w k 移至上面视窗
Ctrl-w h 移至左边视窗
Ctrl-w l 移至右边视窗
Ctrl-w J 将当前视窗移至下面
Ctrl-w K 将当前视窗移至上面
Ctrl-w H 将当前视窗移至左边
Ctrl-w L 将当前视窗移至右边
Ctrl-w - 减小视窗的高度
Ctrl-w + 增加视窗的高度
四、文档加密
创建加密文档
$ vim -x file1
五、在vim执行外部命令
在命令行模式中输入 ! 可以执行外部的shell命令
:!ls 用于显示当前目录的内容
:!rm FILENAME用于删除名为 FILENAME 的文件
:w FILENAME可将当前 VIM 中正在编辑的文件另存为 FILENAME 文件
六、帮助系统
vim中的查看帮助:
普通模式下按F1打开vim自己预设的帮助文档
命令行模式下输入:h shiftwidth 打开名为shiftwidth的帮助文件
命令行模式下输入:ver 显示版本及参数
七、功能设定
1.vim的功能设定
可以在编辑文件的时候进行功能设定,如命令行模式下输入:set nu(显示行数),设定值退出vim后不会保存。
要永久保存配置需要修改vim配置文件。 vim的配置文件~/.vimrc,可以打开文件进行修改,不过务必小心不要影响vim正常使用
2.获取目前的设定(命令行模式)
1) :set或者:se显示所有修改过的配置
2) :set all 显示所有的设定值
3) :set option? 显示option的设定值
4) :set nooption 取消当期设定值
3.set功能的说明(命令行模式)
1) :set autoindent(ai) 设置自动缩进
2) :set autowrite(aw) 设置自动存档,默认未打开
3) :set background=dark或light,设置背景风格
4) :set backup(bk) 设置自动备份,默认未打开
5) : set cindent(cin) 设置C语言风格缩进
这些都可以在配置文件中设置好,不必非要在命令行模式中输入。
深入理解计算机系统
CHAPTER1 LINUX基础
1 Linux命令
Linux中命令格式为:
command [options] [arguments]
命令 [选项] [参数]
中括号代表是可选的,即有些命令不需要选项也不需要参数。
-
选项是调整命令执行行为的开关,选项不同决定了命令的显示结果不同。
-
参数是指命令的作用对象。
2 man命令
man是manul的缩写,我们可以通过man man来查看man的帮助
帮助文档包含:
1 Executable programs or shell commands(用户命令帮助)
2 System calls (系统调用帮助)
3 Library calls (库函数调用帮助)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd(配置文件帮助)
6 Games
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]
解释一下:
1是普通的Linux命令
2是系统调用,操作系统的提供的服务接口
3是库函数, C语言中的函数
5是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义
6是给游戏留的,由各个游戏自己定义
7是附件还有一些变量,比如向environ这种全局变量在这里就有说明
8是系统管理用的命令,这些命令只能由root使用,如ifconfig
man -k
man有一个-k 选项用起来非常好,这个选项让你学习命令、编程时有了一个搜索引擎,可以举一反三。结合后面学习的grep 命令和管道,可以多关键字查找:
man -k key1 | grep key2 | grep key3 | ...
3 cheat 命令
“作弊命令”,简单备忘单
它提供显示Linux命令使用案例,包括该命令所有的选项和简短但尚可理解的功能。
4 其他核心命令
和查找,搜索相关的核心命令还有find,locate,grep,whereis,which,其中:
1) find查找一个文件在系统中的什么位置,locate是神速版本的find(Windows下有个Everything工具和locate类似).
2) grep 可以对文件**全文检索**,支持**正则表达式**,正则表达式也是一个重要的元知识。
3) whereis,which告诉你使用的命令工具装在什么地方。
which比whereis更精确,直接定位到可执行文件。
※grep 管道相关, 前面的输出作为后面的输入
在多关键字检索时,用** | grep **分隔开,这点见 man -k
CHAPTER2 LINUX下C语言开发基础
c语言开发步骤
(1).c 或者 .h 文件编写 ——vim
(2)对文件编译 ——gcc
(3)调试 ——gcd
(4)项目管理或维护 ——make
一、编译工具vim
1.安装
sudo apt-get install vim
2.三种模式
命令行模式
插入模式
底行模式
注
这里说的三种模式与之前的vim编辑器实验中的有差别,分别对应实验指导书中的普通模式、插入模式、命令行模式。
3.常规配置
进入配置文件:
:echo $VIM
进入并改动:
sudo /usr/share/vim/vimrc
设置c语言高亮风格:
if has("syntax")
syntax on
endif
这里是on,就打开高亮。
在下面一群.set的部分,可以加入一些设定,比如:
set showmatch 高亮显示{, }, (, ), [, 或者 ] 的匹配情况
set autoindent 缩进
set nu 显示行号
set ai 自动缩行
set ts=4 设置一个 TAB 键等于几个空格
快捷键-移动光标
[[ 转到上一个位于第一列的"{"
]] 转到下一个位于第一列的"{"
{ 转到上一个空行
} 转到下一个空行
gd 转到当前光标所指的局部变量的定义
4.快捷帮助菜单
:help
:help iccf
除了vim之外,还有Emacs和gedit,都是图形化的文本编辑器,gedit不常用。
二、编译器GCC
1.安装gcc的头文件、库文件
sudo apt-get install build-essential
安装到usr/lib中,到usr/bin中(可执行文件),到usr/include中(头文件)
2.GCC选项列表
(1)常用选项
-c 只编译不链接,生成目标文件.o
-S 只编译不汇编,生成汇编代码
-E 只进行预编译,不做其他处理
-g 在可执行程序中包含标准调试信息
-o file 将file文件指定为输出文件
-v 打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir 在头文件的搜索路径列表中添加dir目录
(2)库选项
-static 进行静态编译,即链接静态库,禁止使用动态库
-shared 1.可以生成动态库文件
2.进行动态编译,尽可能的链接动态库,没有动态库时才会链接同名静态库
-L dir 在库文件的搜索路径列表中添加dir目录
-lname 链接称为libname.a或者libname.so的库文件。
如果两个库文件都存在,根据编译方式是static还是shared进行链接
-fPIC 生成使用相对地址的位置无关的目标代码,
(-fpic) 然后通常使用gcc的-static选项从该pic目标文件生成动态库文件。
3.编译过程
预处理:gcc –E hello.c –o hello.i; gcc –E调用cpp 生成中间文件
编 译:gcc –S hello.i –o hello.s; gcc –S调用ccl 翻译成汇编文件
汇 编:gcc –c hello.s –o hello.o; gcc -c 调用as 翻译成可重定位目标文件
链 接:gcc hello.o –o hello ; gcc -o 调用ld** 创建可执行目标文件
-o后面是接的你给生成的文件指定的名字,如果不指定,则默认为a.out
在命令行上运行这个可执行目标文件需要输入它的名字:
./a.out
为什么?
Window下,搜索一个东西会从当前目录下,找不到去PATH环境变量中找;Linux下只从PATH环境变量中找,所以即使当前目录有,也要指出来; "."表示当前目录,“./libvector.a” 表示用当前目录下的libvector.a库文件。 凡是不带前缀的,都是PATH中有,但不安全。
所以其实这行代码只是在输入它的名字, ./ 表示当前目录
外壳调用操作系统中一个叫加载器的函数,拷贝可执行文件p中的代码和数据到存储器,然后将控制转移到这个程序的开头。
技巧:前三步,GCC的参数连起来是“ESc”,相应输入的文件的后缀是“iso”
4.静态库
(1)静态链接
像Unix ld程序这样的静态链接器,以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。
为了构造可执行文件,链接器必须完成两个主要任务:
- 符号解析
- 重定位
目标文件纯粹是字节块的集合,链接器将这些块链接起来,确定被连接块的运行时位置,并且修改代码和数据块中的各种位置。
(2)静态库
所有的编译系统都提供一种机制,将所有相关的目标模块打包成为一个单独的文件,称为静态库,可以作为链接器的输入。当链接器构造一个输出的可执行文件时,它只拷贝静态库里被应用程序引用的目标模块。
在Unix系统中,静态库以一种称为存档的特殊文件格式存放在磁盘中。存档文件是一组连接起来的可重定位目标文件的集合,有一个头部用来描述每个成员目标文件的大小和位置。存档文件由后缀.a识别。
创建静态库需用用到AR工具
※AR工具的使用:
1.ar基本用法
ar命令可以用来创建、修改库,也可以从库中提出单个模块。
下面是ar命令的格式:
ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...
{dmpqrtx}部分称为操作选项
[abcfilNoPsSuvV]部分称为任选项
{dmpqrtx}中的操作选项在命令中只能并且必须使用其中一个,它们的含义如下:
d:从库中删除模块。按模块原来的文件名指定要删除的模块。如果使用了任选项v则列出被删除的每个模块。
m:该操作是在一个库中移动成员。当库中如果有若干模块有相同的符号定义(如函数定义),则成员的位置顺序很重要。如果没有指定任选项,任何指定的成员将移到库的最后。也可以使用'a','b',或'i'任选项移动到指定的位置。
p:显示库中指定的成员到标准输出。如果指定任选项v,则在输出成员的内容前,将显示成员的名字。如果没有指定成员的名字,所有库中的文件将显示出来。
q:快速追加。增加新模块到库的结尾处。并不检查是否需要替换。'a','b',或'i'任选项对此操作没有影响,模块总是追加的库的结尾处。如果使用了任选项v则列出每个模块。 这时,库的符号表没有更新,可以用'ar s'或ranlib来更新库的符号表索引。
r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
t:显示库的模块表清单。一般只显示模块名。
x:从库中提取一个成员。如果不指定要提取的模块,则提取库中所有的模块。
下面在看看可与操作选项结合使用的任选项:
a:在库的一个已经存在的成员后面增加一个新的文件。如果使用任选项a,则应该为命令行中membername参数指定一个已经存在的成员名。
b:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项b,则应该为命令行中membername参数指定一个已经存在的成员名。
c:创建一个库。不管库是否存在,都将创建。
f:在库中截短指定的名字。缺省情况下,文件名的长度是不受限制的,可以使用此参数将文件名截短,以保证与其它系统的兼容。
i:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项i,则应该为命令行中membername参数指定一个已经存在的成员名(类似任选项b)。
l:暂未使用
N:与count参数一起使用,在库中有多个相同的文件名时指定提取或输出的个数。
o:当提取成员时,保留成员的原始数据。如果不指定该任选项,则提取出的模块的时间将标为提取出的时间。
P:进行文件名匹配时使用全路径名。ar在创建库时不能使用全路径名(这样的库文件不符合POSIX标准),但是有些工具可以。
s:写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做ranlib。
S:不创建目标文件索引,这在创建较大的库时能加快时间。
u:一般说来,命令ar r...插入所有列出的文件到库中,如果你只想插入列出文件中那些比库中同名文件新的文件,就可以使用该任选项。该任选项只用于r操作选项。
v:该选项用来显示执行操作选项的附加信息。
V:显示ar的版本。
2.书上的例子:
创建该库:
gcc -c addvec.c multvec.c
ar rcs libvector.a addvec.o multvec.o
根据上面的内容可以得出,是做了以下动作:
gcc -c只编译,不连接成为可执行文件。
即:把.c文件编译成.o文件
ar -r:在库中插入模块(替换)
-c:创建一个库
-s:写入一个目录文件索引到库中
即:把两个.o文件归档成静态库存档文件.a并且写入目录文件索引到库中。
省略一个调用addvec库例程的main2.c
为了创建它的可执行文件,要编译和链接输入文件main2.o和静态库libvector.a
gcc -02 -c main2.c
gcc -static -o p2 main2.o ./libvector.a
相关指令含义:
gcc -02 和-0都是代码优化指令,可以减少编译时间
-c 只编译,不连接成为可执行文件
-static 告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件
-o 命名生成文件
代码含义:
第一行,将main2.c文件编译成main2.o
第二行,将输出文件命名为p2,链接输入文件main2.o和静态库libvector.a
学习GCC的另外一个重点是:参考教材《深入理解计算机系统》 7.6,7.10节,学习静态库,动态库的制作。
5.动态链接共享库
共享库是一个目标模块,在运行时可以加载到任意的存储器地址,并和一个在存储器中的程序链接起来。这个过程称为动态链接,是由一个叫做动态链接库的程序来执行的。
共享库也称为共享目标,在Unix系统中通常用.so后缀
微软的DLL:动态链接库
构造创建共享库:(同静态库的范例)
gcc -shared -fPIC -o libvector.so addvec.c multvec.c
参数解析:
-fPIC 指示编译器生成与位置无关的代码
-shared 指示链接器创建一个共享的目标文件
-o 命名生成文件
动作是把.c文件编译成为.o文件,放入新建的共享库中,并且命名。
链接程序
gcc -o p2 main2.c ./libvector.so
这样会创建一个可执行目标文件p2,在运行时可以和动态库libverctor.so链接。
静态库和动态共享库的代码区别:
创建
静态库的创建需要调用归档工具ar:
gcc -c addvec.c multvec.c
ar rcs libvector.a addvec.o multvec.o
而动态库只需要gcc即可:
gcc -shared -fPIC -o libvector.so addvec.c multvec.c
链接
静态库的链接需要先编译生成.o文件,然后再和库链接,并且需要staric命令构建一个完全链接的可执行文件:
gcc -02 -c main2.c
gcc -static -o p2 main2.o ./libvector.a
动态库可以直接把.c文件和库文件链接
gcc -o p2 main2.c ./libvector.so
三、调试工具gdb
使用GCC编译时要加“-g”参数
GDB最基本的命令有:
gdb programm(启动GDB)
l 查看所载入的文件
b 设断点
info b 查看断点情况
run 开始运行程序
bt 打印函数调用堆栈
p 查看变量值
c 从当前断点继续运行到下一个断点
n 单步运行(不进入)
s 单步运行(进入)
quit 退出GDB
四种断点:
1.行断点
b [行数或函数名] <条件表达式>
2.函数断点
b [函数名] <条件表达式>
3.条件断点
b [行数或函数名] <if表达式>
4.临时断点
tbreak [行数或函数名] <条件表达式>
问题:GDB的n(next)命令让GDB执行下一行,然后暂停。 s(step)命令的作用与此类似,只是在函数调用时step命令会进入函数,那么实际使用中应该优先选用哪个?为什么?
其他几个我认为应该掌握的调试命令有:
display 跟踪变量值的改变
until 跳出循环
finish 跳出函数
help 帮助
学习参考:
四、Make和Makefile
make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。
而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。
最终实现——自动化编译
进入Makefile?
$ vim Makefile
1.Makefile 基本规则
Makefile的一般写法:
一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:
-
需要由make工具创建的目标体,通常是可执行文件和目标文件,也可以是要执行的动作,如‘clean’;
-
要创建的目标体所依赖的文件,通常是编译目标文件所需要的其他文件。
-
创建每个目标体时需要运行的命令,这一行必须以制表符TAB开头
格式为:
test(目标文件): prog.o code.o(依赖文件列表)
tab(至少一个tab的位置) gcc prog.o code.o -o test(命令)
.......
即:
target: dependency_files
command
2.使用带宏的 Makefile
Makefile中的宏,也称作变量。
变量是在makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。
定义变量的两种方式:
(1)递归展开方式
VAR=var
(2)简单方式
VAR:=var
使用变量的格式为:
$(VAR)
变量的分类
- 用户自定义变量
- 预定义变量
- 自动变量
- 环境变量
作业
- 练习gcc编译运行代码。
- 练习gdb调试代码 。
- 把上述代码中除了main函数外的代码制作成一个静态库math.a和一个共享库math.so。
- 编写makefile,让代码编译,上述静态库和共享库的使用自动化。
步骤:
已经把这些文档输入进去了
报错:没有main函数
没有头文件,我加了头文件之后:
正确了
建立静态库,并命名为math1.a
链接main.o和静态库math.a(上面已经把main.c编译成main.o)
运行:
建立动态库,并命名为math2.so
运行:
编写makefile:
静态库——math3:
动态库math4:
遇到的问题及解决:
1.vim三种模式的不同叫法让我纠结了一阵
2.关于./的含义和静态库编写时候的问题,通过自己思考和询问老师解决。
3.在学习静态库时,看到了ar这个命令没有学过,通过网上搜索了解的它的作用;同时gcc的一些选项的含义也不明白,同样通过百度搜索得到答案。
4.做作业的时候,main.c函数里没有头文件stdio.h和head.h,我开始不清楚是否要补上,但是在编译的时候发现如果不加这两个头文件就会不停的编译出错,无法继续下面的工作,所以这两个头文件是肯定要补上的。
其他
这次的作业前半程做的很辛苦,绝大部分是自找的。在前几天我只知道盲目的学学学,但是太多东西不会,就导致我学的非常辛苦。我喜欢把笔记做的多多的写的完完整整的,所以在前面的笔记里我采取的方法是搜罗手上的各种资料然后集合在一起统统敲上来,力求做到全面。这样带来的后果是非常明显的,我花了大部分的时间来写我的笔记,但是其实并没有真正记住消化多少知识。而且书本上很多内容都看不懂,尤其一些概念都不清楚。
然后我发现,这是由于我的学习方法有问题,毕竟作为打基础的开始,一切都应该循序渐进,我不能妄想一口吃成胖子,一股脑吸取所有知识只能把我压垮,我现在要做的应该是夯实基础,而不是对所有内容来者不拒统统吃下,这必然是非常累,而且低效率的。
然后我改变了自己的学习方法之后,就如同拨得云开见月明,学的更有目的,也更轻松。我不该追求笔记多么多么详实,把很多现在根本无法理解的东西都一股脑的塞给自己,而是先掌握这个知识这个技巧最基本的用法,反复练习加强熟练度。罗马不是一天建成的,学习是循序渐进的事情,我要注重脚下,夯实基础。