Linux下静态库和动态库的制作使用
1.静态库和动态库的区别
首先,一个C++程序从源文件到可执行文件的需要经过:
预编译 - 编译 -汇编 - 链接
静态库和动态库主要在链接的阶段起到不同的效果。在链接阶段,静态库会将程序依赖的库文件复制一份到程序中,来保证程序可以正常运行。而动态库则是将库文件加载到内存中供程序使用。
2.静态库的制作
假设我的程序中有四个算法,我想打包成一个静态库:
其中,add.c 、div.c、mult.c、sub.c是需要制作的库的源文件。head.h是分发给用户的头文件,用户拿到头文件就能知道算法的接口是怎么样子的,以及如何使用。
第一步:将add.c 、div.c、mult.c、sub.c源文件转为.o文件
gcc -c add.c div.c mult.c sub.c
这时候生成了四个.o文件。
第二步:用 archive 制作静态库。使用ar指令将四个.o文件打包成一个格式为libxxx.a 的静态库。注意“xxx”是库的名称,可以自己任意取。比如这里将这个库命名为 “calc”,那么执行指令如下:
ar rcs libcalc.a *.o
其中,“ar”是archive 软件的缩写,rcs分别表示“插入”、“创建”、“索引”。
第三步:将头文件head.h分给用户,用户拿到手知道怎么使用。
第四步,在gcc编译的时候指定使用的静态库:
gcc main.c -o app -l calc
其中,-l 用于指定库,而calc是库的名称。注意calc文件要在main文件的同级目录下。
最后执行app可执行文件即可:
./app
3.动态库的制作
在第一步也是将.c文件转化成.o文件。但是不一样的是要加上指令 “-fpic”来生成和位置无关的.o文件:
gcc -c -fpic add.c div.c mult.c sub.c
在第二步创建动态库:
gcc -shared *.o -o libcalc.so
注意动态库是以.so结尾的。
生成之后和静态库一样使用即可。