使用
我们先来看一下如何使用,首先进入vim test.c
写好文件后保存
接下来编译该文件(由于有些情况会报错,我们要在后面加上-std=c99,编译器版本较低可能会引起报错)
在这里我们也可以直接让他变成我们想要的名字
生成编译文件
最后运行
程序的翻译过程
1.编程语言,翻译成计算机语言
2.编程语言翻译成计算机语言是由编译器来做的
3.c/c++写的任何软件都是c/c++编译器编译
预处理
1.头文件展开->2.去注释->3.条件编译->4.宏替换
头文件展开就是把包含的头文件拷贝到原文件里
预处理完了还是c语言吗?显然 ,还是c语言
-E代表了从现在开始帮我进行程序的翻译,等预处理做完就停下来,别往后继续走
使用底行模式输入vsp code.c进行分屏再使用ctrl+ww进行来回切换,这边我们可以清晰的看到宏定义被替换成了123在code.i文件里面
编译
把c语言翻译成汇编语言
汇编
把汇编翻译成可重定位二进制文件
从现在开始进行程序的翻译,等汇编做完就停下来
使用二进制查看工具od查看
但是该二进制文件不能执行
链接
形成可执行文件
二进制文件转链接等价于gcc code.o
动静态库的概念与理解
链接
1.我们现在所有写的代码,已经有人给我们写好了对应的可以直接使用的接口,就是所说的库函数
也就是说我们的代码+头文件+库=我们可执行的程序
我们所谓的安装环境就是下载拷贝头文件和库然后拷贝到特定路径下,一定能被编译器找到。头文件提供声明,库文件提供链接。
库命名
libc.so.6就是所谓的c标准库
.so:动态库->xxxx.dll
.a:静态库->xxxx.lib
动态库vs静态库
什么是链接?
你所写的代码变成xxx.o,切系统中大部分的指令都是c/c++写的,都是依赖的各种动静态库。
动态库是c/c++或者其他第三方库所有方法的集合,被所有程序以链接的方式关联起来。
静态库是c/c++或者其他第三方库所有方法的集合,被所有程序以拷贝的方式,将所要的代码,拷贝到自己的可执行文件中。
库中所有的函数,都有入口地址,所谓的动态链接,就是把要链接的的函数地址拷贝到我们可执行文件的特定位置
动态链接的优缺点:
优点:因为只需要拷贝地址,所以形成的可执行程序体积比较小,比较节省磁盘和内存空间资源
缺点:对于链接时间会稍慢一些,动态库没了,所有依赖这个库的程序都无法运行了
静态链接的优缺点:
优点:无视库,可以独立运行
缺点:体积太大,浪费资源
如下分别建立静态链接和动态链接的文件,可以清晰的看到静态链接的所消耗的内存比
c的静态库的安装:c++的静态库安装:
转载他人博客
Centos 8 安装 gcc-5.5_51CTO博客_centos 安装gcc
我们的开发环境,默认都要为我们做什么?
1.下载开发环境,include,lib
2.设置合理的查找路径
3.规定好我们形成的可执行程序的连接方式
自动化构建代码
make/makefile:基础
make:是一个命令
makefile:是一个在当前目录下存在的一个具有特定格式的文本文件
创建Makefile文件
vim编辑该文件后使用make命令,系统会自动生成可执行文件(其中第一行称为依赖关系,第二行称为依赖方法。依赖关系+依赖方法==描述清楚一件事情的原因和做法,能达到我们的目标)
然后我们./mybin就可以执行该文件了
如果我们想要将mybin给清理掉那么我们可以在Makefile文件中添加如下
保存退出后执行make clean,此时我们可以发现mybin的文件消失了,linux将
默认操作
make总是自动执行Makefile文件中的第一个依赖关系操作,我们将删除和编译的顺序对调一下
执行make指令后,系统模式执行的啥clean
我们如果想给文件编译的话,那么需要执行make mybin
识别文件新旧
我们编译完后再次编译,linux会识别出可执行文件是否是最新的,如果想重新编译,那么则需要去修改一下原.c文件,因为原始的代码没有被更改过,重新编译成本会很高,一定是先有原文件,才有bin文件,第一次原文件的修改时间一定是小于bin的修改时间,第二次的时候原文件修改过了,时间一定是大于bin文件的,所以就可以重新编译
stat
可以看到访问时间,文件等于内容加属性,更改时间的本质就是访问磁盘,assess是对文件进行访问,但并不是每次访问都会更改时间,linux中大量访问磁盘的io操作,变相的减慢系统效率,老款的内核会实时更新,新款的内核为了提高效率,减少了更改的时间,modify是指对内容做修改,change对文件的属性做修改,改属性可能不会改内容(权限),改内容一定会改属性
touch-a
直接更新一下文件的时间,可以让对应的原文件变成最新的(没有改内容),
.PHONY:clean
通过时间对比,可以做到不让有些代码进行重新编译(不让某些操作进行操作),不再对比时间,总是会重新编译执行
编译过程
@符号
在vim中依赖方法最前面加上@符号,可以不显示创建的过程
@echo可以直接答应出字符信息