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:

linux第七章读书笔记的更多相关文章

  1. <深入理解计算机系统>第七章读书笔记

    第七章读书笔记 链接 链接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.(这个文件可被加载或拷贝到存储器并执行) 链接可以执行于编译,加载或运行时. 静态链接: 两个主要任务: 1 符号 ...

  2. 《Linux内核设计与实现》第七章读书笔记

    第七章.中断和中断处理 7.1中断 中断使得硬件得以发出通知给处理器.中断随时可以产生,内核随时可能因为新来到的中断而被打断. 不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标志.操作系统给 ...

  3. 2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接

    第七章--链接 0.总结 链接编译时可以采用静态链接或动态链接. 连接器主要任务:符号解析和重定位. 多个目标文件可定义相同的符号,可以被连接到一个单独的静态库. 链接器可以生成部分链接的可执行文件 ...

  4. linux第四章读书笔记

    第四章 进程调度 一.多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于可运行状态.多 ...

  5. 2013337朱荟潼 Linux第五章读书笔记——系统调用

    摘要: [20135337朱荟潼]原创作品转载请注明出处 第五章 系统调用 5.1 与内核通信 中间层 作用三个:1.为用户空间提供一种硬件的抽象接口:2.保证系统稳定和安全:3.除异常和陷入,是内核 ...

  6. 2013337朱荟潼 Linux第三章读书笔记——进程管理

    第三章 进程管理 总结 fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,资源的复制而不是指针的复制. vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的 ...

  7. 2013337朱荟潼 Linux第四章读书笔记——进程调度

    第4章 进程调度 0. 总结 调度:调度是一个平衡的过程.一方面,它要保证各个运行的进程能够最大限度的使用CP:另一方面,保证各个进程能公平的使用CPU. 调度功能:决定哪个进程运行以及进程运行多长时 ...

  8. 20135320赵瀚青LINUX第三章读书笔记

    第三章 进程管理 3.1 进程 进程的定义: 是处于执行期的程序以及它所包含的资源的总称. 线程的定义: 是在进程中活动的对象. 每个线程都拥有一个独立的程序计数器.进程栈和一组进程寄存器. 内核调度 ...

  9. 20135320赵瀚青LINUX第五章读书笔记

    第五章--系统调用 5.1 与内核通信 作用 1.为用户空间提供一种硬件的抽象接口 2.保证系统稳定和安全 3.除异常和陷入,是内核唯一的合法入口. API.POSIX和C库 关于Unix接口设计:提 ...

随机推荐

  1. mount: block device /dev/cdrom is write-protected, mounting read-only 解决方法

    [root@localhost ~]# mount /dev/cdrom /mnt/cdrom/ mount: block device /dev/sr0 is write-protected, mo ...

  2. ajax jquery校验用户是否已经注册

    服务端代码这里就不贴了 html代码比较简单,需要自行引入jquery库 <body> 请输入用户名:<input type="text" id="us ...

  3. 在ubuntu 10.04 上QGIS的安装步骤

    进入管理员账户后,打开/etc/apt/sources.list. 添 加 deb http://ppa.launchpad.net/ubuntugis/ubuntugis-unstable/ubun ...

  4. Android Graphviz 安装

    1. Windows下使用android ADT工具dmtracedump.exe绘图在windows下使用dmtracedump绘图时,出现如下错误: 'dot' 不是内部或外部命令,也不是可运行的 ...

  5. mysql load data导入脚本

    # !/bin/bash ############中文说明###################### #本程序的一些提示需要中文支持,如系统没有安装中文包,请先安装:yum -y groupinst ...

  6. 详解Go语言中的屏蔽现象

    在刚开始学习Go语言的过程中,难免会遇到一些问题,尤其是从其他语言转向Go开发的人员,面对语法及其内部实现的差异,在使用Go开发时也避免不了会踩"坑".本文主要针对Go设计中的屏蔽 ...

  7. postgresql----IN&&EXISTS

    一.IN && NOT IN WHERE expression IN (subquery) 右边圆括号内是返回一个字段的子查询结果集,左边的表达式(或字段)对查询结果每一行进行一次运算 ...

  8. Guava增强for循环

    Guava的前身是Google Collections,是Google开发出的一个开源Java常用类库,包含了一些集合的便捷操作API.本文通过一些常用的例子来剖析Guava的奇妙之处. Guava是 ...

  9. C#操作word之插入图片

    假如我们导出一份简历到word文档,那势必可能要同时导出我们包含的简历,下面就来试一下如何和通过C#代码,将图片插入到word文档中. 为了简便起见,就简单一点.类似下面这样的 姓名 张三 照片   ...

  10. 终于修好了MacBook

    之前由于Trackpad故障,陆家嘴苹果店开了维修单,让我在2周内去更换,详见第二次去苹果店维修MacBook. 后来由于购买了AppleCare进行延保,又担心放在那维修时间长,就懒得去更换了. 昨 ...