资讯

展开

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文件
vim和gcc/g++的使用、项目自动化构建工具make/Makefile
预处理后lc.i文件

编译;生成汇编;

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –S lc.i –o lc.s

编译后生成的汇编代码
自动化构建工具
汇编;生成机器可识别代码;

汇编阶段是把编译阶段生成的“.s”文件转成目标文件
可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c lc.s –o lc.o

汇编后生成的二进制目标代码
vim

链接;生成可执行文件或库文件;

在成功编译之后,就进入了链接阶段。
实例: gcc lc.o –o mytest

vim
函数库一般分为静态库和动态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了;将库中我们要的方法的地址填入到可执行程序中;建立关联;。其后缀名一般为“.a”
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。;将库中方法的实现真的拷贝到我们的可执行程序中;。动态库一般后缀名为“.so”;gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件, gcc默认生成的二进制程序;是动态链接的;可以通过 file 命令查看。

vim
用-static表明使用静态链接的方法形成可执行程序
自动化构建工具

make/Makefile

一个工程中的源文件不计数;其按类型、功能、模块分别放在若干个目录中;makefile定义了一系列的规则来指定哪些文件需要先编译;哪些文件需要后编译;哪些文件需要重新编译;甚至于进行更复杂的功能操作。我们只需要在makefile里指定所有的操作;然后在用make这个操作;即可让整个工程自动编译。make是一条命令;makefile是一个文件;两个搭配使用;完成项目自动化构建
vim
可以通过make指令分别生成预处理;编译;汇编;链接后的文件
vim
;前的为目标对象;而;号后面的为依赖对象; 上面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只管文件的依赖性;即;如果在我找了依赖关系之后;冒号后面的文件还是不在;那么对不起;我就不工作啦

加载全部内容

相关教程
猜你喜欢
用户评论
快盘暂不提供评论功能!