vim和gcc/g++的使用、项目自动化构建工具make/Makefile

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++

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)
    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的原理

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。
  3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
  4. 如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明
    make的终极任务,也就是执行文件hello了。
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁华的梦境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值