linux第七章读书笔记
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,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.复制及粘贴文本(普通模式中)
1) 复制——y
yy复制游标所在的整行(3yy表示复制3行)
y^ 复制至行首,或y0。不含光标所在处字符。
y$ 复制至行尾。含光所在处字符。
yw 复制一个单词。
y2w 复制两个单词。
yG 复制至文本末。
y1G 复制至文本开头。
2) 粘贴——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]
命令 [选项] [参数]
中括号代表是可选的,即有些命令不需要选项也不需要参数。
1) 选项是调整命令执行行为的开关,选项不同决定了命令的显示结果不同。
2) 参数是指命令的作用对象。
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: