Linux系统下,共享库:
共享库:引用库中相应二进制代码的入口位置,从而间接引用
在Linux中,以lib***.so.xx 为格式
/etc/ld.so.conf 共享库的搜索位置
如:
#cat /etc/ld.so.conf
/usr/kerberos/lib
/usr/X11R6/lib
/usr/lib/sane
/usr/lib/qt-3.1/lib
ldconfig 共享库管理工具,在更新了共享库后运行该命令
ldd 查看可执行文件所用的共享库
使用共享库示例:
如:
libhello.c libhello.h usrhello.c //共享库源文件、共享库头文件、应用程序
#cat libhello.c //查看库源文件内容
#include <stdio.h>
void print_hello(void)
{
printf("hello world,this is library!/n");
}
#cat libhello.h //查看库头文件内容
#ifndef __libhello_H__
#define __libhello_H__
void print_hello(void);
#endif /*__libhello_H__*/
#cat usrhello.c //查看应用程序
#include "libhello.h"
int main()
{
print_hello();
return 0;
}
//开始生成共享库
#gcc -fPIC -Wall -g -c libhello.c //生成目标文件libhello.o
-fPIC 生成与位置无关代码
-g 生成调试信息
-c 编译成.o 文件
#gcc -g -shared -W1,-soname,libhello.so.0 -o libhello.so.0.0 libhello.o -lc //生成共享库
-shared 创建共享库
-W1 为将后面的“soname,libhello.so.0”传递给共享库
-soname,libhello.so.0 说明soname为libhello.so.0,其目标名为libhello.0.0
-lc 引用C库
#ln -sf libhello.so.0.0 libhello.so.0
前面定义库名为libhello.so.0,因此需要创建一个libhello.so.0到libhello.so.0.0的连接
#ln -sf libhello.so.0 libhello.so
为了在连接用户的程序时使用lhello,需要再进行连接
#gcc -Wall -g -c usrhello.c 生成目标文件usrhello.o
-Wall 去除所有警告
#gcc -g -o usrhello_shared usrhello.o -L ./ -lhello //连接库
#ldd usrhello_shared
libhello.so => not found //在默认搜索路径中没有找到此库
#LD_LIBRARY_PATH=$(pwd) ./usrhello_shared //指明库的路径
hello,world,library!
使用静态库,可以直接编译到执行文件中,因此文件执行不需要查找该库的路径
使用共享库,运行时需要相应库的支持
Linux系统首先会在“LD_LIBRARY_PATH”变量下查找库文件
然后到/etc/ld.so.conf文件里所给的路径查找
Linux会在路径/lib /usr/lib下的库文件中搜索,下面是将创建自己的库文件添加到搜索路径的方法:
1、创建共享库,保存在一个文件夹下
2、如果希望在连接时不使用-L标识,就把库文件拷贝到/lib /usr/lib下,
把保存路径填写到文件/etc/ld.so.conf里
3、执行命令#ldconfig,更新库信息