共享库:链接时仅记录用到哪个共享库中的哪个标号(函数),不复制共享库中的代码到可执行文件中。
共享库特点:程序不包含库中的代码,尺寸小。多个程序可以共享同一个库。程序运行时需要加载库。库升级方便,无需重新编译程序。
共享库的创建:
第一步:编译生成目标文件
使用命令 gcc -c -fPIC filename1.c filename2.c -Wall // -fPIC表示位置无关代码
具体操作入下:
comlib1.c
#include<stdio.h>
void prt()
{
printf("I love China\n");
return;
}
comlib2.c
#include<stdio.h>
void prt2()
{
printf("I love China,too!\n");
return;
}
编译生成目标文件:
第二步: 创建共享库common
使用命令 gcc -shared -o libcommon.so.1 filename1.o filename2.o //lib .so 为固定格式 1代表版本号。
具体操作如下:
第三步:为共享库创建链接文件
使用命令 ln -s libcommon.so.1 libcommon.so
第四步:编译主函数文件,并链接上libcommon.so
使用命令 gcc -o test.c -L. -lcommon
此命令和静态库中的一样,寻找库的时候也是先找common.so找不到就找common.a
test.c
#include<stdio.h>
void prt(); //声明库中的接口
void prt2();
int main()
{
prt();
prt2();
return 0;
}
注意!!!!
此时如果直接执行文件./test 会报错,系统找不到共享库,会报错。
需要修改加载库的环境变量,命令入下:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
ps:系统找不到共享库的解决办法还有如下两种:
1、直接将库拷贝到/lib 和 /usr/lib 目录下 //一般不太推荐,这两地方都是存放系统自带的库。
2、增加配置文件 /etc/ld.so.conf.d/*.conf 然后ldconfig刷新。
comlib.conf里面的内容是共享库的路径,如笔者的为/home/.../.../..../creatcommonlib
总结:
共享库的制作比静态库要麻烦,主要是在编译的时候静态库是直接复制代码到可执行文件处,而共享库则是仅记录用到哪个共享库中的函数,不复制共享库中的相关代码。