Vim与gcc初步学习

一、Vi/Vim编辑器
VI(Visual Interface),是一个文本编辑器,主要在Unix及类Unix环境中使用。
Vim(Vi+improved)在Vi的基础之上进行了功能提升,相当于Vi的增强版。
所有类Unix 系统都会内建vi文本编辑器,就像window电脑上的记事本一样,可以对文本内容进行编辑,vi编辑器是Unix系统最初的编辑器, 允许查看文件中的行、在文件中移动、插入、编辑和替换文本 。
然而由于Unix系统是商业操作系统,国外一牛逼的程序员“ 理查德·斯托曼”发起了GNU计划(该计划目标是创建一套完全自由的操作系统,实现Unix系统的标准接口,因此完全向上兼容Unix,但是可以自由使用),在GNU项目中,程序员将vi编辑器移植到开源世界的同时对其做了改进,因此重命名为“Vi improved”,也就是我们说的vim。
ps: GNU 项目,英文全称为“GNU is Not Unix”,简单的说,就是一个开发类 Unix 操作系统的项目,GNU 操作系统是由 GNU 软件包及其第三方的免费软件包组成,所以其最大的特点就是免费。
因此vim是从vi发展而来的一个具有编程能力的文本编辑器, 可以主动的以字体颜色辨别语法的正确性,方便程序设计。 vim具有代码补全、编译及错误跳转等方便编程的功能,在程序员中被广泛使用。

Vim编辑器有三种模式:一般模式、编辑模式、命令模式。
1.一般模式
主要进行复制、粘贴、删除操作
yy:复制当前光标所在行,如yy复制当前光标所在行开始的
y2y:表示从当前光标所在行开始复制2行
yw:复制一个单词。光标之后开始复制,包括词尾的空格;如果想要复制整个单词,就要把光标放到单词首字母
p:粘贴。粘贴到当前光标的下一行(复制的行),或当前光标字符之后(复制的单词)
dd:删除光标当前行
dd:删除光标当前行开始的行,如d2d:表示从当前光标所在行开始删除2行
dw:删除光标之后的一个单词光标之后开始删除,包括词尾空格;如果要删除整个单词,光标放到单词首字母,类似yw
x:删除光标之后的一个字符,相当于del
X:删除光标之前的一个字符相当于Backspace
u:撤销

2.编辑模式
在一般模式下,通过如下i、a、o、r命令进入编辑模式,对文档内容进行编辑。命令的区别在于进入编辑模式后光标插入点不同。
i:当前光标前
I:当前光标所在行行首
a:当前光标后
A:当前光标所在行行尾
o:当前光标下一行,新开一行
O:当前光标上一行,新开一行
r:当前光标之后,新输入会替换一个字符
R:替换当前光标之后的多个字符

3.命令模式
在一般模式下,可以通过以下三个命令:“:”、“/”、“?”进入底行命令模式完成文件保存、内容查找及字符替换功能。执行完命令可以通过ESC返回一般模式。
w:保存
q:退出
!:强制执行
例如
:w 保存
:w filename 文件另存为filename
:wq 保存并退出
:wq! 强制保存并退出
:wq! filename 文件另存为filename并退出编辑器

二、gcc编辑器
GCC是以GPL许可证所发行的自由软件,也是GNU计划的关键部分。GCC的初衷是为GNU操作系统专门编写一款编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,甚至在微软的Windows上也可以使用GCC。GCC支持多种计算机体系结构芯片,如x86、ARM、MIPS等,并已被移植到其他多种硬件平台。
GCC原名为GNU C语言编译器(GNU C Compiler),只能处理C语言。但其很快扩展,变得可处理C++,后来又扩展为能够支持更多编程语言,如Fortran、Pascal、Objective -C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。
交叉编译:在当前CPU平台下编译出在其他CPU平台下可执行代码。
从源文件到可执行文件共经历四步,分别是预处理,编译,汇编,连接。
1.预处理:对头文件进行展开(.i文件),宏替换,条件编译。
<>:搜索路径是系统的头文件目录。
“”:搜索路径是现在当前目录查找,找不到的话再到系统头文件目录查找。
几个命令
-E:仅执行编译预处理,生成 . i文件
-I:用来指定程序要链接的库,后跟库名
-D:宏定义

2.编译:生成 .s 汇编文件,并进行语法检查
-S:将c代码转换为汇编代码

3.汇编:通过汇编将编译文件转化成二进制目标文件
-C:只生成 .O 目标文件

4.链接:符号表建立,生成可执行文件 a.out
-o:指定输出文件的文件名
-wall:开启所有警告
-w:关闭所有警告
gcc -01/02/03:使用编译优化级别1/2/3编译程序,级别越大效果越好。

静态库(.a)和动态库(.so)的制作
1.库文件:保存函数和变量,只能使用但不能看到其实现
2.静态库:在编译阶段加载(将库文件的代码加载到源文件)
动态库:在运行时加载(将库文件的代码加载到源文件)
两个库生成的可执行文件有区别:
(1)静态库生成的可执行文件 > 动态库生成的可执行文件(程序与形式占用内存较多。
(2)使用静态库难以进行升级,使用动态库易于升级。
(3)使用静态库运行速度快,使用动态库运行速度慢。
(4)使用静态库里的代码容易部署,动态库里的代码难以部署。
/lib:存放系统运行所需库
/usr/lib:存放程序运行所需库

制作静态库的方法
1.将需要保存的函数所在的文件编译生成目标文件(如gcc -c add.c -->add.o)
2.静态库制作工具 ar
ar rcs(不存在就创建,存在就更新)库名 目标文件名
如:ar rcs libadd.a add.o
3.使用gcc源文件 -l库名 -L 库存放的路径

动态库的制作方法
gcc -shared -fPIC 源文件 -o libcal.so
gcc -shared -fPIC add.c -o libcal.so
使用:
cp libcal.so /usr/lib
gcc main.c -lcal

gcc main.c./libcal.so -ocal

gcc -static 是让gcc进行静态编译,禁止调用动态库,就是把所有需要的函数库都集成进编译出来的程序上,这个程序就可以不依赖外部的函数库运行了。

你可能感兴趣的:(笔记)