《后台开发核心技术与应用实践》第四章 读书笔记 编译
1.编译与链接
预处理
预处理使.cpp文件预处理成.i文件
g++ -E helloworld.cpp -o helloworld.i
预处理是处理以"#"开头的预编译指令
比如展开宏定义,处理所有的条件预编译指令#if #elif
处理#include指令,过滤注释内容,添加行号和文件名标识
编译
编译就是进行词法分析、语法分析、语义分析、中间代码生成、目标代码生成优化
g++ -S helloworld.i -o helloworld.s
链接
组装源代码的各个模块,包含了地址空间分配,符号决议和重定位等步骤
静态链接:编译时绑定,以lib开头,接着是静态库名,以.a为后缀名
动态链接:运行时绑定,以lib开头,以.so为文件扩展名
动态库与静态库的特点:
- 动态链接库有利于进程间的资源共享。
- 用静态库,如果库发生变化,使用库的程序要重新编译,用动态库,只要动态库提供给程序的接口没变,只要重新用新生成的动态库替换原来的就可以。
- 由于静态库在编译的时候,就将库函数装载到程序中去了,动态库函数必须在运行时才被装载,程序在执行的时候,用静态库速度更快。
2.makefile编写
makefile中会定义一系规定,指定哪些文件需要先编译,哪些文件需要后编译。
第一行是目标文件,第二行依赖,第三行也是依赖,当用户键入make clean时,会删除*.o和helloworld文件
3.目标文件
ELF是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储的标准文件格式。
ELF文件类型:
- 可重定位的目标文件
- 可执行的目标文件
- 可被共享的目标文件