文章目录
一、动静态库的基本介绍
在Linux操作系统中静态库文件是以 .a 作为后缀的,动态库以 .so 作为后缀。
- 静态库(.a):静态库的代码是在程序编译链接的时候就被链接到可执行文件当中的,在程序运行的时候就不需要静态库代码了。
- 动态库(.so):动态库的代码是程序运行的时候才去链接的,多个程序可以共享使用动态库的代码。
- 一个动态库链接的可执行文件只包含这个可执行文件用到的动态库内函数入口地址的一个表,而不是该函数所在目标文件的整个机器码。也就是说,当可执行文件用到动态库的某个函数时,链接到可执行文件当中的只有这些函数入口的地址,并没有这些函数的具体实现方法。
- 动态链接是指在可执行文件运行之前,操作系统就会将该可执行文件运用到的动态库函数的具体实现代码从磁盘加载到内存里。
- 静态链接是在可执行文件编译链接时就将静态库拷贝到可执行文件当中。
- 动静态库的命名方式为 lib + 库名 + 后缀 ,例如libxxx.a表示静态库,libxxx.so表示动态库。
二、静态库
1.生成静态库
在写C++的STL模拟实现的时候,我们经常会定义三个文件,一个(.h)头文件用来放类和函数的声明,一个(.cpp)源文件来放函数的定义,一个(.cpp)文件来写main函数做测试或者使用类。我们可以举一个简单的例子来看一下平时我们是怎么做的。
创建mymath.h头文件用来声明addToVal函数:
创建mymath.c文件用来写addToVal函数的具体实现方法:
创建test.c文件写main函数,测试addToVal函数:
然后我们创建makefile文件,平常我们就是用这种方式来生成可执行文件的:
我们现在不想像以前那样生成可执行文件了,我们想要把头文件和源文件打包成一个静态库,我们在原有的mymath.h头文件和mymath.c源文件基础上,再增加myprint.h和myprint.c文件,把这四个文件打包成一个静态库。
首先我们要将(.c)源文件变成 .o 文件,输入指令gcc -c mymath.c
、gcc -c myprint.c
,生成了对应的 .o 文件。
链接就是将所有的 .o 文件链接形成一个可执行程序。如果我们不打包,直接将所有的 .o 文件给别人,别人也可以用来生成可执行程序,例如