程序的翻译过程
- 预处理(头文件展开,条件编译,宏替换,去注释)
- 编译 :把c变成汇编语言
- 汇编 :把汇编变成二进制(不可执行,二进制目标文件)
- 链接 :把自己写的代码和c标准库中的代码合起来 ---链接的过程
头文件最大的意义:
- 写代码
- 支持代码自动补齐
预处理之前:
预处理之后:
选项的含义
gcc -字母 test.c -o test.后缀
- -o 指形成的临时文件名称
- -E是表示从现在开始进行程序的翻译到预处理结束就停下来(.i)
- -S 做完汇编工作就停下来(.s)
- -c 把汇编语言转化为可重定向二进制目标文件(.o)
- gcc test.o -o mytest.out 链接的过程生成可执行的二进制程序(库+你的代码)
- ESc -> iso(镜像)
补充:
- 批量化注释 CTRL+V 然后 j/k两个按键上下选中区域 然后 shift+i(l) 最后 // 加Esc
- 批量化删除注释:CTRL V ->hjkl选中区域 -> d即可
- Linux系统中文件后缀没有意义,但是gcc这个软件要求文件后缀名是.c/.cpp
动态链接和静态链接
链接的本质就是我们调用库函数的时候和标准库如何进行关联的问题?
- 前三步是对我们自己写的代码进行处理,我们自己写的代码和库是两码事。
- C标准库 是 别人已经给我们准备好的,让我们直接使用的。我们所以使用库中函数的代码例如(printf..),其中我们只写了对于该函数的调用,没有对应的实现!只有在 链接的时候,对应的实现,才和我们的代码关联起来。
动态链接
- 动态库是C/C++或者其他第三方提供的所有方法的集合,被所有程序 以:链接的方式,关联起来
- 静态库是C/C++或者其他第三方提供的所有方法的集合,被所有程序 以拷贝的方式,将需要的代码,拷贝到自己的可执行程序中!
- 动态链接优缺点:
- 优点:形成的可执行程序体积比较小,比较节省资源的!
- 缺点:稍慢一些,强依赖动态库,动态库没了,所有的依赖这个库的程序都无法运行了
- 静态链接优缺点:
- 优点:无视库,可以独立运行
- 缺点:体积太大,浪费资源
为什么系统一般不会自带静态库,而选择动态库呢?
- 编译器默认链接的方式是动态链接
默认情况下,你们的云服务器是没有安装c静态库的,只有动态库,如果你要安装
- C语言的静态库:sudo yum install glibc-static
- C++的静态库:sudo yum install -y libstdc++-static
系统本身为了支持我们编程需要给我们提供
- 标准库的.h(告诉我们怎么用)
- 标准的动静态库 .so/.a(告诉我们需要去哪找到方法)
我的代码+库的代码 = 可执行程序
补充:
- windows下原理一样 动态库 .dll 静态库 .lib
- 与Linux一样,编译器默认链接的方式是动态链接