vi编辑器
命令行中输入vi/vi 文件名
即可启动vi编辑器
vi的操作方式
1.命令方式
2.编辑方式
3.ex转义方式
(一)命令方式
在命令方式下,从键盘输入的数据作为vi命令提交给编辑器,这种模式下,用户可以再文件中随意移动,或者进行剪切、复制和粘贴等操作。在命令方式下输入a附加命令或者i插入命令等,可以进入编辑方式。输入“:”进入ex转义方式。
(二)编辑方式
在编辑方式下,从键盘输入的数据作为要输入的文本记录到待编辑的文件中。从编辑方式进入命令模式的方法是按键
(三)ex转义方式
ex是Linux系统下的另一个编辑工具,其与vi编辑器在用户界面上不同。所谓ex转义方式,就是在vi编辑器中调用ex编辑器的命令完成相应的编辑操作。
vi编辑器的功能键
在命令方式下:
<Esc>:
用于从插入方式返回到命令方式。
<Enter>:
用于ex转义方式,结束ex命令。
/
:用于从当前位置开始向后查找一个指定的串。在进行查找的过程中,可以随时输入n命令查找下一个匹配的项。
?
:用于从当前位置开始向前查找一个指定的串。在进行查找的过程中,可以随时输入n命令查找下一个匹配的项。
:
:在命令状态输入冒号将进入ex模式。
在编辑方式下:
<Ctrl>+<U>
:用于将光标移回至本次编辑的起始位置重新开始编辑。刚才的编辑操作将被取消。
<Ctrl>+<V>
:消除下一个键入字符的特殊含义。
<Ctrl>+<W>
:把光标移回至上次编辑的单词的第一个字符上。
退出vi编辑器
1.命令ZZ:在命令方式下,输入ZZ将保存当前的修改并退出vi编辑器。
2.ex转义命令:x
:通过输入ex转义命令,可以保存当前的修改并退出vi编辑器。
3.ex转义命令:q!
:可以不保存当前的修改,强制退出。
vi编辑器的命令
1.光标移动命令
向前(右)移动:l、空格键、右箭头
向后(左)移动:h、退格键、左箭头
移动到下一行:+、<Enter>、j、<Ctrl>+<N>、下箭头
移动到上一行:k、<Ctrl>+<P>、上箭头、
移动到行首:0、^
移动到行尾:$
移动到某行:[行号]G
移动到某列:[列号]|
向前移动一个单词:w、W
向后移动一个单词:b、B
2.滚动屏幕命令
滚动半页:<Ctrl>+<U>/<D>
滚动一页:<Ctrl>+<F>/<B>
刷新屏幕:<Ctrl>+<R>/<L>
3.文本编辑命令
在当前位置插入:i
在当前位置附加:a
在当前行末尾附加:A
开始新行:o、O
4.文本删除命令
删除字符:x、X
删除部分字符:dd删除当前行;dw删除当前位置的一个单词;d$从当前位置删除至行尾
。在使用删除命令时,删除操作所删除的文本被存放到一组缓冲栈中,这组缓冲栈的编号从1到9.最后一次删除的内容在1,可以通过+缓冲栈编号+p
命令把已删除的文本放到当前编辑行的下面。
5.文本修改命令
回退修改:u和U。u命令回退到上一条命令;U命令回退到进入本行来所做的全部修改
重复执行命令:.(点)命令。
替代单个字符:s命令。
替代当前行:R命令。
连接两行:J命令。
6.文本移动命令
如果需要复制部分内容,则可以组合y命令和p命令来实现。即先执行y命令将要复制的内容复制到vi的缓冲区,然后移动光标到要复制的目标位置。执行p命令即可将在缓冲区中的要复制到数据复制到当前位置。
如果需要移动当前部分内容,则使用d命令和p命令组合来实现。
7.搜索命令
/(?)、n、N:/(?)命令的功能是搜索指定的内容
8.ex转义命令
编辑命令:e+“文件名”
可以打开一个新的外部文件进行编辑。如果当前文件未保存,vi会提示用户是否保存。
写命令:ex转义模式下,输入w命令可以对当前编辑的文件进行保存
读入命令:输入r+“文件名”可以读入外部文件内容附加到当前编辑行的后面。
vi编辑器的选项
1.开关选项,打开这类选项使用“set选项名”即可,关闭使用“set no 选项名”;
2.字符串选项,“set 选项名=选项值”
常用vi选项有一下几个
ai:autoindent,指定每行数据总与上行数据进行对齐。
directory:该选项指定了缺省的编辑缓冲区目录。
list:显示制表符和行尾信息。
exrc:该选项被打开,则vi编辑器执行时的工作目录下的.exrc文件中的选项信息将发挥作用。
ic:即ignorance,指定在vi编辑器中进行搜索时,是否忽略大小写间的区别。
nu:number,在编辑过程中对每行数据进行编号。
sm:showmatch在输入右边的圆括号、花括号或者方括号时,将显示左边的对应的另一半括号。
选项的设置方式:
一是可以直接在使用vi编辑器过程中通过执行set命令进行设置;二是在vi编辑器的启动文件.exrc中进行设置。前者只在本次发挥作用,后者长期有效。
gcc编译器
编译的过程可以分划为预编译、编译、优化和汇编4个子过程。
预编译的主要工作是对源程序中的伪指令(即#开头的指令)和特殊符号进行处理的过程。通过预编译处理,将生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。
1.宏定义指令:#define和#undef。#define name string
将name的地方用string替代。#undef
取消对某个宏的定义。
2.条件编译指令:#ifdef、#ifndef、#else、#elif、#endif等。通过条件编译指令,程序员可以在源程序中通过定义不同的宏决定编译程序对哪些代码进行处理,预编译程序将根据宏定义的配置信息,将那些不必要的代码过滤掉。
3.头文件包含指令
预编译之后编译程序会将其翻译成等价的中间代码或者汇编代码,在使用gcc进行编译时,缺省情况是不会输出汇编代码的文件的,如果读者需要查看这个文件的内容,可以在编译时指定-S选项。这样就会有同名的汇编文件。
优化包括两部分:一种是对中间代码的优化,这种优化不依赖具体的计算机硬件,主要是删除 公共表达式、循环优化、无用值删除……另一种与计算机硬件结构紧密相关的对目标代码的生成而进行。要对编译过程进行优化,可以通过两种手段,一在gcc编译选项中指定-O选项进行优化,另一种定义环境变量CFLAGS。
-O选项表示设定优化级别。优化级别共分为3级,由高到低分别为O3、O2、O1,大多数情况下O2已经足够;
-march选项表示为特定的CPU类型编译二进制代码。如果编译时指定了该选项,则编译出的代码不能在级别低的cpu上运行。
链接过程
编译程序将生成二进制的目标代码,这些代码虽然是机器代码,但还不能执行,需要进行链接操作后,才可形成可执行程序。链接的过程是把代码中各种符号引用和符号定义转换为可执行文件中的信息的过程,链接又分静态链接和动态链接。
静态链接:把各种函数库中包含的目标代码静态添加到可执行文件中。
动态链接:将这些函数库的路径、函数名等信息添加到可执行文件中,在执行过程中动态加载相应函数库。
静态链接生成的可执行文件较大,可独立运行,不需要额外的动态库的支持;
动态链接生成的可执行代码较小,程序升级灵活。
gcc编译环境下,常见文件扩展名的含义如下:
-.c:C源程序
-.h:头文件
-.s:汇编程序代码
-.o:目标代码
-.a:函数库
-.y:Yacc-C源文件
-.l:Lex源语法
gcc不仅可以编译C还可以编译C++
gcc常用语法
-c:只进行编译,不进行链接。
-S:输出汇编代码文件。
-o:链接生成可执行文件。
-g:产生符号调试工具
-O:在编译链接过程进行优化。
-Idirname:将dirname所指的目录加入到“头文件搜索目录列表”中,在预编译过程中使用该参数。
-Ldirname:将dirname所指出的目录加入到“函数库搜索目录列表”中。
-Iname:再链接过程中加载名字为“libname.a”的函数库。该函数库位于系统预设的ulu或则由-L选项确定的目录下。要加载系统函数库是不用定义-L的,加载自定义的函数库,则必须先通过-L选项指定,然后才可以用-l选项加载。
用gcc生成可执行文件
要使用gcc生成一个可执行文件,需要经过编译、链接过程。
编译过程的脚本如下gcc -c -O -I dirname x.c
:-c表示只进行编译,不链接;-O表示进行优化;-I表示制定x.c所有到的头文件目录
链接过程的脚本如下gcc -L dirname -lyyy x.o -o x
:-L指定了链接时用到的库文件;-lyyy指定要链接函数库libyyy.a;-o x指定链接后产生的可执行文件的名称。
用gcc编译器生成动态链接库
使用动态链接库不仅可以节省内存空间,还可以提高系统的安全性。
(1)编译。gcc -fPIC -c xxx.c
:-fPIC选项的含义是通知gcc编译器产生可以重定位的目标代码。
(2)链接。gcc -shared -o libxxx.so xxx.o
经过编译链接,既可以生成动态链接库,其扩展名为.so。执行file命令查看文件类型时,可以看到类似”ELF 32-bit LSB shared object“的信息。
如何使用动态链接库
要使用系统已有的动态链接库,可以有两种方式:
一是通过设置环境变量LD_LIBRARY_PATH的方式如:export LD_LIBRARY_PATH=/home/sharedlib
,也可以在.profile文件中进行设置以保证长期有效;
一是通过dlopen系列系统调用动态打开的方式,主要包括dlopen、dlsym、dlclose等函数。期中dlopen打开一个动态库,可以在函数中直接制定动态库的路径名,dlsym用于将动态库中的函数映射到本地函数指针。经过映射后,就可以本地应用程序中调用动态库中的函数完成相应的功能,最后用dlclose完成动态库的卸载。
gcc常见错误
1.语法错误
2.头文件未找到
先检查include的方式,接着检查系统头文件目录/usr/include是否有相应的头文件,若采用include”“这种形式的检查gcc编译时是否-I选项正确指定头文件的查找目录。
3.函数库未找到或函数在函数库中没有发现
按照-L选项指定的目录、系统函数库目录(/usr/lib /lib)的顺序检查是否有相应的库函数。如果函数库存在,检查调用函数的名称以及参数是否存在问题。另外,要特别注意-l选项指定的要链接的库与库文件名称的关联。
4.符号未定义
make的使用
make是一个非常重要的编译工具。利用make工具,用户可以将大型的开发项目分解成多个更易于管理的模块。make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互的关系并自动维护编译工作。makefile文件需要按照某种语法进行编写,文件需要说明如何编译各个源文件并链接生成可执行文件,并要求定义源文件之间的依赖关系。默认使用makefile作为makefile文件。如果要使用其他文件为makefile,则可以使用make时指定-f选项使用不同的makefile文件。makefile包含一下内容:
1.显式规则:定义了如何生成一个或者多个的目标文件,即显式地指出要生成的文件、文件的依赖项、生成的命令等。
2.隐含规则:make工具中包含一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件建立特定类型的目标文件。Linux系统通常支持一种基于文件扩展名的规则,这种规则定义了如何将一个具有特定文件名后缀的文件,转换为具有另一种文件名后缀的文件。
3.宏(变量)定义
makefile允许使用简单的宏指代源文件机器相关编译信息,在Linux中也称宏为变量在引用时只需在变量前加$符号,值得注意的是,如果变量名的长度超过一个字符,在使用必须加圆括号
4.注释
在makefile中只有行注释,在行首使用”#“字符即表示本行内容为注释
makefile的书写规则
1.基本规则
Targets:Prerequisites
Command
Targets:文件名,以空格分开,可以使用通配符。
Prerequisites:目标所依赖的文件。
Command:命令行,如果其不与”Targets:Prerequisites”在一行,那么,必须以<Tab>
键开头,在一行,可以用分号作为分隔。太长可以使用(\)作为换行符。
2.定义变量
在makefile中使用变量类似于C语言中的宏,不同的是用户可以在makefile中改变其值。变量声明时需要给予初值,使用时需要在变量名前加上“$”符号
3.环境变量
make工具支持环境变量,通过设置环境变量可以改变make的默认动作。下面详细介绍各种常见的工程变量的内容:
(1).VPATH环境变量
定义VPATH,make就会在找不到当前目录的情况下,到VPATH指定的目录去找。
(2).CFLAGS环境变量
指定了C语言编译器参数。
(3).LDFLAGS环境变量
指定了C语言链接器参数。
4.通配符的使用
make支持3个通配符* ? [...]
5.使用条件判断
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。语法如下:
<conditional-directive>
<text-if-true>
else
<text-if-false>
endif
conditional-directive代表条件关键字,共有4个:ifeq、ifneq、ifdef、ifndef。
ifeq(<arg1>,<arg2>)
ifdef<variable-name>
6.在makefile中使用函数
$(<函数名称><函数参数1><函数参数2><...>)
1.字符串替换函数subst$(substr<from>,<to>,<text>)
2.去空格函数strip$(strip<string>)
3.查找字符串函数findstring$(findstring<find>,<in>)
4.排序$(sort<list>)
5.取目录函数dir$(dir<路径名>)
6.取前缀函数basename$(basename<文件名>)
7.变量来源函数orgin$(orgin<变量名>)
7.make与gcc的区别
make可以定义项目中不同源文件之间的依赖关系这样可避免许多不必要的编译工作。,而gcc将编译任何源文件。
make工具
makefile编写完成后,可以通过执行make命令进行编译操作
要执行make命令只需要在命令行输入make即可。make可以包含若干选项。
-b、-m:忽略和其他版本的make的兼容性
-B、--always-make:强制重新编译所有的目标
-C<dir>、--directory=<dir>:指定读取makefile的目录
-debug[=<options>]:输出make的调试信息。
options的取值:
a:all,输出所有的调试信息
b:basic,只输出简单的调试信息,即输出不需要重新编译的目标
v:verbose,再b选项的级别上。输出的信息包括哪个makefile别解析、不需要被重新编译的依赖文件等
i:implicit,输出所有的隐含规则
j:jobs,输出执行规则中命令的详细信息
m:makefile,输出make读取makefile、更新makefile、执行makefile的信息
make命令的工作过程
1.读入makefile;2.初始化makefile文件中的变量;3.推导隐含规则;4.根据依赖关系,检查哪些依赖项发生了变更;5.执行生成命令。
在makefile中使用伪目标
对于makefile,目标是要生成的文件。通常情况,一个makefile存在一个最终的目标,其他的目标都是为这个最终目标服务的。多数情况下,一个makefile中的可能会指定多个目标。允许在使用make的过程中在makefile中定义伪目标。常用的伪目标有以下几种:
all:这个伪目标是所有目标的目标,功能一般是编译所有的目标
clean:这个伪目标的功能是删除所有被make创建的文件
install:这个伪目标的功能是安装已编译号的程序,其实就是把目标执行问价复制到指定的目标中去
print:这个伪目标的功能是输出改变过的源文件
tar:把源程序打包备份
dist:创建一个压缩文件
TAGS:更新所有目标,以备完整地重编译使用
check/test:测试makefile的流程
make命令的返回值
0:成功
1:出现错误
2:使用了make的-q选项,并且make使得部分目标不需要更新
参考文献《Linux编程从入门到精通》