Linux编辑器-vim
下面介绍vim的三种模式分别是命令模式、插 入模式、底行模式,其它模式就不一一讲了。 正常/普通/命令模式
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入插入模式下,或者到底行模式。
插入/编辑模式
只有在插入模式下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是用的最频繁的编辑模式
底行模式
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。
输入vim test.c就可以进入vim全屏幕编辑画面,进入vim之后,是处于[正常模式],你要切换到[插入模式]才能够输入文字。 [正常模式]切换至[插入模式]: 输入a或i或o [插入模式]切换至[正常模式]: 处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下「ESC」键转到[正常模式]再删除文字。当然,也可以直接删除。 [正常模式]切换至[末行模式]:输入shift + ;, 其实就是输入: 在底行模式下可以输入 w (保存当前文件) wq (存盘并退出vim) q! (不存盘强制退出vim) w!(强制保存) x!(保存并退出编辑,仅当文件有修改时会保存,并修改文件的时间属性 输入set nu后,会在文件的每一行前面列出行号 底行输入vs + 文件名还可以进行分屏操作 !cmd(不退出vim执行对应命令,比如执行命令行、编译、运行、查看man等)
Linux编译器-gcc/g++
- 预处理(进行宏替换)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 连接(生成可执行文件或库文件)
gcc编译器怎么用?
格式 gcc [选项] 要编译的文件 [选项] [目标文件]
比如执行gcc mytest.c -o mytest编译生成mytest文件,-o:用于指定目标文件名称 预处理(进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E lc.c –o lc.i 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序
预处理前lc.c文件 预处理后lc.i文件 编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。 可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 实例: gcc –S lc.i –o lc.s
编译后生成的汇编代码 汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件 可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了 实例: gcc –c lc.s –o lc.o
汇编后生成的二进制目标代码
链接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段。 实例: gcc lc.o –o mytest
函数库一般分为静态库和动态库
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了(将库中我们要的方法的地址填入到可执行程序中,建立关联)。其后缀名一般为“.a” 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。(将库中方法的实现真的拷贝到我们的可执行程序中)。动态库一般后缀名为“.so”,gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件, gcc默认生成的二进制程序,是动态链接的,可以通过 file 命令查看。
用-static表明使用静态链接的方法形成可执行程序
make/Makefile
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。我们只需要在makefile里指定所有的操作,然后在用make这个操作,即可让整个工程自动编译。make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建 可以通过make指令分别生成预处理,编译,汇编,链接后的文件 :前的为目标对象,而:号后面的为依赖对象, 上面makefile文件中test:lc.o称为依赖关系,g++ lc.o -o test称为依赖方法。如果要生成一个test,就要利用这个lc.o来生成,如果没有lc.o,就要先生成一个lc.o。lc.o依赖lc.s,lc.s依赖lc.i,la.i依赖lc.c。如果要生成一个test,就要先生成一个lc.o,要生产lc.o就要先生成一个lc.s,这样一层一层往下,就完成了一步步的构建。 我们还可以使用通配符来简写makefile $@表示目标对象 $^表示依赖对象 $<表示所有依赖对象的第一个 项目清理
.PHONE: [命令] 声明伪对象,无论对象是否最新,每次都重新生成,.PHONY 修饰伪目标的特性是,总是被执行的。 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编 译
因为工程是需要被清理的,我们就可以将这种clean的目标文件设立为伪目标,因为它总是被执行的。 make的原理
- make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。
- 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
- 如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
- 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明
make的终极任务,也就是执行文件hello了。 - 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
- 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
- make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦
|