学习目标:
掌握gcc编译器编译过程
掌握静态库和动态库的制作
学习内容:
gcc编译器编译过程
库文件
静态库和动态库
静态库和动态库的制作
学习时间:
周四
学习产出:
优快云 技术博客 31篇
gcc编译器编译过程
预处理:处理所有以#开头的代码,包括头文件、宏定义、条件编译
gcc -E hello.c -o hello.i
#include 头文件展开
#define 宏定义替换
#if 条件编译 如果不满足 代码丢掉
编译:语法检查以及将C语言变成汇编语言
gcc -S hello.i -o hello.s
汇编:将汇编语言变成二进制文件
gcc -c hello.s -o hello.o
链接:链接代码需要用到的其他文件(库文件等)
gcc hello.o -o hello
动态库和静态库
库文件
库文件(存放在lib文件夹中):存放函数和变量的仓库。
特点:只能使用库里的函数和变量,不能看到其实现。
静态库(通常以.a结尾):当使用静态库时,库里的函数和变量是在编译时加载到可执行文件。
动态库(通常以.so结尾):当使用动态库时,库里的函数和变量是在运行时加载到可执行文件的。
优缺点: 1、可执行文件大小:静态库>动态库(指内存使用效率)
2、可执行文件速度:静态库>动态库(指运行效率)
3、可执行文件的升级:动态库>静态库(指功能升级的难易程度)
4、可执行文件的代码部署:静态库>动态库(指代码部署的位置)
“文件名”:这类文件是在目前目录下寻找,找不到再依次寻找。
<文件>:这类文件在lib库寻找 库文件的存放路径:/lib/usr/lib
如何制作静态库和动态库
静态库
gcc -c 源文件 xx.o 生成二进制文件
gcc rcs 库文件名字 目标文件 静态库
gcc 源文件 -/库名 -L库的路径
动态库
gcc -shared -fPIC源文件 -o库名
gcc 源文件 ./库名 -o 可执行文件