1.静态库与动态库概念
静态库(.a):程序在编译链接的时候把库的代码拷贝到可执行文件中。程序运行的时候将不再需要静态库。动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。注:1.一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。也就是说如果可执行程序是动态链接生成的,程序里面如果涉及到外部函数调用,可执行程序中记录的是外部函数的地址,外部函数具体的实现还在动态库中。2.在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)。3.动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
2.生成动静态库
2.1.生成静态库
以往的写法:
创建一个mklib目录,在该目录下创建静态库。在mklib目录下创建mymath.h、mymath.c文件,mymath.h文件写入下图一所示的代码,mymath.c文件写入下图二所示的代码。
创建一个test.c文件,写入下图三所示的代码,创建makefile文件,写入下图四所示的代码。使用make命令生成可执行程序,然后使用./test执行该程序,运行结果如下图五所示。
注:在mymath.c文件中,我们在for循环体内定义了i变量,如果gcc版本低可能会报错,如下图所示,要解决该问题,我们在makefile文件中生成可执行程序的gcc命令行后面带上-std=c99,如下图二所示,即采用c99标准进行编译。
静态库的写法:
创建一个mklib目录,在该目录下创建静态库。在mklib目录下创建mymath.h、mymath.c、myprint.h、myprint.c文件,mymath.h文件写入下图一所示的代码,mymath.c文件写入下图二所示的代码,myprint.h文件写入下图三所示的代码,myprint.c文件写入下图四所示的代码。
创建makefile文件,写入下图五所示的代码,