小白日志(二)
Linux系统开发工具及其使用
一、vi(文本编辑器)
vi是Visual Interface的简称,vi并不是一个排版程序,它不像Word或者WPS那样可以对字体、格式、段落等属性进行编排。它仅仅只能对文本进行编辑,没有图形界面,有的只是命令。
- vi有三种工作模式
名称 | 概述 |
---|---|
命令行模式 | 控制屏幕光标的移动,字符。字或行的删除,移动复制某个区段以及进入插入模式或者底行模式 |
插入模式 | 只有在插入模式下,才可以输入文字,进入插入模式时左下角会出现“插入”二字以作提示 |
底行模式 | 将文件保存或者退出vi,也可以设置编辑环境,如寻找字符串、列出行号等。 |
vi的一些小白常用命令(个人觉得使用频率较高的)
-
vi的进入与退出
-
输入以下命令你就进入vi文本编辑模式了。
#vim (空格) filename //filename为你取的文件名
另外:
#vim (空格) filename.c //在文件名后面加入“*.c”系统会将其识别为c语言编程文件
#vim (空格) filename.cpp //在文件名后面加入“*.cpp”系统会将其识别为c++语言编程文件
#vim (空格) filename.sh //在文件名后面加入“*.sh”系统会将其识别为shell脚本编程文件
根据文件后缀,系统配置文件会在编程时根据语法规则让一些关键字高亮以方便我们查阅和编写。
注意:进入vi文本编辑模式时,是处于**[命令行模式]**,初次使用vi的同学习惯性使用方向键控制光标,结果发出“哔哔哔”的叫声,先按下[a]或[i]或[o]切换至[插入模式]再进行输入。
- 按下[ ESC ]键可退出[ 插入模式 ],返回到[ 命令行模式 ],在[ 命令行模式 ]下按下[ : ]可以进入[ 底行模式 ]。
[ 底行模式 ]下输入界面会出现在窗口左下方:
:w(空格)filename //将内容以指定的文件名filename保存,但不会退出vi
:wq //将内容存至当前文件,并且退出vi
:ZZ //作用同 :wq
:q //退出vi,但不保存当前内容,退出时会询问是否继续
:q! //强制退出vi,不保存当前内容,也不进行询问,慎用!
- vi复制、删除、移动
“不过还是抵不过配置文件往里一装来的爽,末尾会附上自己用的配置文件给大家下载配置”在[ 命令行模式 ]下:
- [ dd ] 删除光标所在行。
这里所谓删除,其实个人觉得有剪切的意思,因为按下这个指令,该行内容会被暂时推入缓冲区,按下[ p ]在光标所在行的下一行可以将删除行的内容进行粘贴 - [ #dd ] 从光标所在行开始删除#行
- [ yy ] 复制光标所在行到缓冲区中
- [ #yy ]复制从光标所在的该行往下数的#行内容
- [ p ]将缓冲区中的内容粘贴到光标所在位置的下一行
- [ G ]移动到内容的最后
- [ 0 ]数字0移到内容的开头
在[ 底行模式 ]下:
- [ :set (空格) nu ]能够显示当前文件下每一行的行号
- [ :set (空格) no]取消显示当前文件的行号
- [ :# ]能够跳到当前文件下的第#行
- [: /### ]###为你想找的字符,按下[ n ]能够向下查找下一个所找字符
- [ :?### ]###为你想找的字符,按下[ n ]能够向上查找下一个所找字符
- : s / old / new /g 可以将光标所在全行中的old替换为new
- : # , # s / old / new /g 可以将#行到#行之间所有的old替换为new
- : %s / old /new /gc 将全文的old替换为new,会进行询问
二、GCC(GNU CC编译器)
GNU CC是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。gcc不仅功能强大,而且可以编译如C、C++、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件。gcc实质上不是一个单独的程序,而是多个程序的集合,因此通常称为工具链。
- 在正式说gcc之前先来说一下程序的组成:
需要明确的一点是:虽然一个个程序是由一行行代码组成的,但是程序在进行编译的时候是以文件为单位进行编译的。
程序的编译过程
- 从上图我们可以看到编译过程主要包括:
1. 预处理阶段
在这一阶段,源码中的所有预处理语句得到处理,预处理之后源码中不再包含任何预处理语句。
例如:
- #include语句所包含的文件内容替换掉语句本身
- 所有已定义的宏被展开
- 根据#ifdef,#if等语句的条件是否成立取舍相应的部分
编译预处理阶段生成*.i的文件,通过选项-E可以使编译器在预处理阶段结束时就停止编译。例如:
[ root@localhost home ]#gcc -E test.c -o test.i //选项-E可以使编译器在预处理结束时就停止编译
[ root@localhost home ]#ls //查看当前目录下的文件
test.c test.i
2.编译阶段
编译阶段是整个编译过程中最为复杂的一个阶段,也是尤为重要的一个阶段,因此通常把整个生成可执行程序的过程称为编译。编译阶段可以理解为“翻译前查缺补漏阶段”,用英译汉做个对比,例如在把“I love China”翻译成中文之前,需要检查句子的单词拼写是否正确,需要考察句子的语法(主谓宾等结构)是否正确,再查看句子的语意是否符合。
- 同理可知高级编程语言的编译阶段也需要这样的三个步骤:
步骤 | 作用 |
---|---|
词法分析 | 主要负责检查关键字、标识符等是否正确 |
语法分析 | 主要负责检查程序中语句的语法是否正确 |
语义分析 | 主要负责检查程序中语句的逻辑意义是否正确 |
gcc编译阶段生成*.s的文件,通过选项-S可以使编译器在编译阶段结束时就停止编译。例如:
[ root@localhost home ]#gcc -S test.i -o test.s
[ root@localhost home ]#ls
test.c test.i test.s
3.汇编阶段阶段
这一阶段使用汇编器对汇编代码进行处理,生成机器语言代码,即CPU可识别的二进制文件,保存在后缀为.o的目标文件中。当程序由多个代码文件构成时,每个文件都要先完成汇编工作,生成.o目标文件后,才能进入下一步的链接工作。目标文件已经是最终程序的某一部分了,只是在链接之前还不能执行。
在window系统,目标文件的后缀是*.obj
gcc编译阶段生成*.o的文件,通过选项-c可以使编译器在汇编阶段结束时就停止编译。例如:
[ root@localhost home ]#gcc -c test.s -o test.o
[ root@localhost home ]#ls
test.c test.i test.s test.o
4.链接阶段
目标文件虽然已经可以被CPU直接识别,但是单个目标文件一般是无法运行的。链接阶段的任务便是把程序中的目标文件和所需的库文件都链接到一起,最终生成一个可以直接运行的文件,称可执行文件。
[ root@localhost home ]#gcc test.o -o test
[ root@localhost home ]#ls
test.c test.i test.s test.o
- 可以看到/home 目录下生成的可执行文件为 test