20135202闫佳歆-信息安全系统设计基础第三周学习总结

Vim编辑器

Vim 仅仅经过键盘来在插入和执行命令等多种模式之间切换。这使得Vim能够不用进行菜单或者鼠标操做,而且最小化组合键的操做,对文字录入员或者程序员能够大大加强速度和效率。linux

CHAPTER 1.VIM快速入门

1、Vim的六种基本模式

1.普通模式

Vim的普通模式用的编辑器命令,好比移动光标,删除文本等等。这也是Vim启动后的默认模式,而不是大多数编辑器的插入模式。程序员

普通模式命令每每须要一个操做符结尾。正则表达式

普通模式进入插入模式的方法:a键(append/追加)键或者i(insert/插入)键。shell

2.插入模式

在这个模式中,大多数按键都会向文本缓冲中插入文本。大多数新用户但愿文本编辑器编辑过程当中一直保持这个模式。编程

插入模式中回到普通模式:ESC键。vim

3.可视模式

与普通模式相似,但移动命令会扩大高亮的文本区域。高亮区域能够是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。安全

4.选择模式

这个模式中,能够用鼠标或者光标键高亮选择文本。app

若是输入任何字符,Vim会用这个字符替换选择的高亮文本块,而且自动进入插入模式。编辑器

5.命令行模式

在命令行模式中能够输入会被解释成并执行的文本。例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。函数

在命令执行以后,Vim返回到命令行模式以前的模式,一般是普通模式。

6.Ex模式(Ex mode)

这和命令行模式比较类似,在使用:visual命令离开Ex模式前,能够一次执行多条命令。

※三种经常使用模式的切换:

经常使用模式:普通模式、插入模式和命令行模式。

普通→插入: i 或 a 
插入→普通: Esc 或 Ctrl + [
普通→命令行: :
命令行→普通:Esc 或 Ctrl + [

命令行模式下输入wq ,回车后保存并退出。

2、进入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       移动到上一个单词

3、进入插入模式

在普通模式下使用下面的键将进入插入模式,并能够从相应的位置开始输入。具体按键对应以下:

i   在当前光标处进行编辑
I   在行首插入
A   在行末插入
a   在光标后插入编辑
o   在当前行后插入一个新行
O   在当前行前插入一个新行
cw  替换从光标所在位置后到一个单词结尾的字符

※每次要先回到普通模式才能切换成以不一样的方式进入插入模式

4、保存文档

命令行模式下保存文档

(1)从普通模式输入:进入命令行模式,输入w回车,保存文档。

(2)输入:w 文件名能够将文档另存为其余文件名或存到其它路径下.

5、退出vim

1.命令行模式下退出vim

从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑

如下为其它几种退出方式:

:q! 强制退出,不保存
:q  退出
:wq!    强制保存并退出
:w <文件路径>   另存为
:saveas 文件路径    另存为
:x  保存并退出
:wq 保存并退出

2.普通模式下退出vim

普通模式下输入Shift+zz便可保存退出vim

6、删除文本

1.普通模式下删除vim文本信息

进入普通模式,使用下列命令能够进行文本快速删除:

x   删除游标所在的字符
X   删除游标所在前一个字符
Delete  同x
dd  删除整行
dw  删除一个单词(不适用中文)
d$或D    删除至行尾
d^  删除至行首
dG  删除到文档结尾处
d1G 删至文档首部

CHAPTER 2. VIM文档编辑

1、vim重复命令

1.重复执行上次命令

在普通模式下.(小数点)表示重复上一次的命令操做。

2.执行指定次数相同的命令

进入普通模式输入N,N表示重复后面的次数。

在普通模式下, dw或者daw(delete a word)删除一个单词,因此dnw(n替换为相应数字)表示删除n个单词

2、游标的快速跳转

普通模式下,下列命令可让光标快速调转到指定位置,咱们分别讨论快速实现行间跳转行内跳转

1.行间跳转

  • nG(n Shift+g) 游标移动到第 n 行
  • gg 游标移动到到第一行
  • G(Shift+g) 到最后一行

※ 小技巧:Ctrl+o快速回到上一次(跳转前)光标所在位置

2.行内跳转

普通模式下使用下列命令在行内按照单词为单位进行跳转

w   到下一个单词的开头
e   到下一个单词的结尾
b   到前一个单词的开头
ge  到前一个单词的结尾
0或^ 到行头
$   到行尾
f<字母>   向后搜索<字母>并跳转到第一个匹配的位置(很是实用)
F<字母>   向前搜索<字母>并跳转到第一个匹配的位置
t<字母>   向后搜索<字母>并跳转到第一个匹配位置以前的一个字母(不经常使用)
T<字母>   向前搜索<字母>并跳转到第一个匹配位置以后的一个字母(不经常使用)

※ ~能够将游标所在字母转换大小写

3、复制粘贴和剪切

1.复制及粘贴文本(普通模式中

1) 复制——y

yy复制游标所在的整行(3yy表示复制3行)
y^ 复制至行首,或y0。不含光标所在处字符。
y$ 复制至行尾。含光所在处字符。
yw 复制一个单词。
y2w 复制两个单词。
yG 复制至文本末。
y1G 复制至文本开头。

2) 粘贴——p

p(小写)表明粘贴至光标后(下)
P(大写)表明粘贴至光标前(上)

2.剪切及粘贴

dd删除命令就是剪切,剪切后就可使用p来粘贴。

※实用功能:交换上下行——ddp,快速交换光标所在行与它下面的行。

CHAPTER3 查找替换

1、字符的替换及撤销(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的操做

2、快速缩进

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)       使本行内容靠左

3、查找

1.快速查找(普通模式下

a)  输入 / 而后键入须要查找的字符串 按回车后就会进行查找。 
b)  ?与/功能相同,只不过?是向上而/是向下查找。 
c)  进入查找以后,输入n和N能够继续查找 n表示继续查找,N反向查找。

2.高级查找(普通模式下

a)  \*寻找游标所在处的单词
b)  \#同上,但 \* 是向前(上)找,#则是向后(下)找
c)  g\*同\* ,但部分符合该单词便可
d)  g\#同\# ,但部分符合该单词便可

※以上查找n,N 的继续查找命令依然能够用

CHAPTER4 高级功能入门

1、多文件编辑

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

来恢复

2、可视模式命令简介(普通模式)

1.  v(小写)   进入字符选择模式,就能够移动光标,光标走过的地方就会选取。再次按下v会后就会取消选取。
2.  Shift+v(小写) 进入行选择模式,按下V以后就会把整行选取,您能够上下移动光标选更多的行,一样,再按一次Shift+v就能够取消选取。
3.  Ctrl+v(小写)  这是区域选择模式,能够进行矩形区域选择,再按一次Ctrl+v取消选取。
4.  d   删除选取区域内容
5.  y   复制选取区域内容

3、视窗操做简介

(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 + 增长视窗的高度

4、文档加密

建立加密文档

$ vim -x file1

5、在vim执行外部命令

在命令行模式中输入 ! 能够执行外部的shell命令

:!ls 用于显示当前目录的内容
:!rm FILENAME用于删除名为 FILENAME 的文件
:w FILENAME可将当前 VIM 中正在编辑的文件另存为 FILENAME 文件

6、帮助系统

vim中的查看帮助:

普通模式下按F1打开vim本身预设的帮助文档

命令行模式下输入:h shiftwidth 打开名为shiftwidth的帮助文件

命令行模式下输入:ver 显示版本及参数

7、功能设定

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

1、编译工具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不经常使用。

2、编译器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

3、调试工具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 帮助
学习参考:

4、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,我开始不清楚是否要补上,可是在编译的时候发现若是不加这两个头文件就会不停的编译出错,没法继续下面的工做,因此这两个头文件是确定要补上的。

其余

此次的做业前半程作的很辛苦,绝大部分是自找的。在前几天我只知道盲目的学学学,可是太多东西不会,就致使我学的很是辛苦。我喜欢把笔记作的多多的写的完完整整的,因此在前面的笔记里我采起的方法是搜罗手上的各类资料而后集合在一块儿通通敲上来,力求作到全面。这样带来的后果是很是明显的,我花了大部分的时间来写个人笔记,可是其实并无真正记住消化多少知识。并且书本上不少内容都看不懂,尤为一些概念都不清楚。

而后我发现,这是因为个人学习方法有问题,毕竟做为打基础的开始,一切都应该按部就班,我不能妄想一口吃成胖子,一股脑吸收全部知识只能把我压垮,我如今要作的应该是夯实基础,而不是对全部内容来者不拒通通吃下,这必然是很是累,并且低效率的。

而后我改变了本身的学习方法以后,就如同拨得云开见月明,学的更有目的,也更轻松。我不应追求笔记多么多么详实,把不少如今根本没法理解的东西都一股脑的塞给本身,而是先掌握这个知识这个技巧最基本的用法,反复练习增强熟练度。罗马不是一天建成的,学习是按部就班的事情,我要注重脚下,夯实基础。

相关文章
相关标签/搜索