概念
静态库是所有编译系统都会提供的一种机制,所有相关的可重定位目标文件被打包成一个 单独的存档文件,这个存档文件 被称作静态库,可以作为链接器的输入,在linux系统中,静态 库被存放在磁盘上,由后缀.a标识。
在使用静态库时,只需要在命令行上指定静态库的名字,链接时链接器会复制程序中需要使用的相关函数的目标模块,这 样的做法大大节省磁盘和内存空间,也给实际使用带来方便(只需在命令行中包含少数静态库文件的名字)
操作
- 生成位置无关的目标文件,先准备两个简单的功能函数add.c、dec.c和一个主函数main.c
int add(int lhs,int rhs){
return lhs+rhs;
}
int dec(int lhs,int rhs){
return lhs-rhs;
}
#include
int add(int lhs,int rhs);
int dec(int lhs,int rhs);
int main(int argc,char*argv[])
{
int lhs=8;
int rhs=1;
int ret;
ret=add(lhs,rhs);
printf("ret=%dn",ret);
return 0;
}
用add.c和dec.c分别生成可重定位目标文件,后在用可重定位目标文件add.o和dec.o生成静态库libfunc.a(func是静态库的名字)
linux>gcc -c -o add.o add.c linux>gcc -c -o dec.o dec.c linux>ar crsv libfunc.a add.o dec.o
2.将生成的静态库放入系统库文件中
linux>sudo cp libfunc.a /usr/lib
3.链接
linux>gcc main.c -o main -lfunc
4.运行检查
5.修改main函数内容并重新链接
#includeint add(int lhs,int rhs); int dec(int lhs,int rhs); int main(int argc,char*argv[]) { int lhs=8; int rhs=1; int ret; ret=dec(lhs,rhs); printf("ret=%dn",ret); return 0; }
linux>gcc main.c -o main -lfunc动态库
概念
动态库是一个目标模块,动态链接是一个过程,当程序加载和运行时,动态链接库可以被 加载到任意的一个内存地址,并和在内存中的一个程序链接起来,这个过程叫做动态链接,动 态链接由一个名为动态链接器的程序实现。
动态链接可在程序被加载或运行时实现,加载时动态链接(应用程序被加载后执行前):需 要在编译时将库链接到应用中,具体做法为链接器生成一个部分链接的可执行目标文件,加载 器在加载该目标文件时,会先加载动态链接器,动态链接器会将共享库重定位到某个内存段, 之后在重定位该目标文件对所有共享库定义的符号的引用来完成链接任务,生成一个完全链接 的可重定位目标文件,最后动态链接器会把控制传递给应用程序,此刻开始共享库的位固定, 并且在程序运行过程中都不会改变。
操作
- 用需要打包成动态库的函数生成位置无关的可重定位目标文件,依然用add.c、dec.c和main.c举例
linux>gcc -c add.c -o add.o -fpic linux>gcc -c dec.c -o add.o -fpic
2.用该位置无关的可重定位目标文件生成动态库文件
linux>gcc -shared add.o dec.o -o libfunc2.so
3.将动态库文件移动到系统路径下
linux>sudo cp libfunc2.so /usr/lib
4.链接
linux>gcc main.c -c main -lfunc2
5.运行检查
动态库两种更新方式
- 不设置新版本号,比如对函数add.c进行了修改,之后重复上述123步骤(注意:与静态库不同,无需重新链接,内容会更新)
2.设置新的版本号,可以是libxxx.so.x.x.x的格式在,系统路径下保存所有版本的库文件,利用软链接来更新
// 比如新版本动态库文件为libfunc3.so,先删除原来的libfunc2.so,然后建立libfunc3.so和libfunc2之间的软链接,这样无需重新链接,下次运行main时就会调用libfunc2.so指向的libfunc3.so //每次版本更新,删除libfunc2.so,建立新版本和libfunc2.so之间的软链接即可 //此操作在系统库文件下进行,路径/usr/lib linux>sudo ln -s libfunc3.so libfunc2.so



