1
1.1共享库的文件的生成和调用步骤
(1)共享库文件的生成步骤
a.编写源程序xxx.c,如:vi add.c
b.只编译不链接生成xxx.o,如:
cc -c -fpic/*小模式*/add.c
c.生成共享库文件
cc -shared 目标文件 -o lib库名.so
cc -shared add.o -o libadd.so
(2)共享库文件的使用步骤
a.编写测试源程序xxx.c,如:vi mian.c
b.只编译不链接生成目标文件xxx.c,如
cc -c main.c
c.链接测试文件和共享文件,方式有三种:
(1)直接链接
cc main.o libadd.so
(2)使用编译选项进行链接
cc main.o -l add -L.
(3)配置环境变量LIBRARY_PATH:.
exPRot LIBRARY_PATH=$LIBRARY_PATH:.
cc main.o -l add
注意:
使用共享库文件时,切记需要配置环境变量
export LD_LIBRARY_PATH$=LD_LIBRARY_PATH:.
上述指令用于解决运行时,加载不到共享库的问题
扩展:
ls -l libadd.so
- rwx rxw r-w
文件类型 属主权限 属组权限 其他用户权限
1 tarena tarena 6654
硬链接数 属主名称 属组名称 文件大小
12月 2 09:47 libadd.so
文件最后一次修改时间 文件名称
其中文件的常见类型如下:
-表示普通规则文件
d表示目录文件
其中文件的权限解析如下:
r读权限 4
w写权限 2
x执行权限 1
-没有此权限 0
1.2共享库的动态加载
(1)dlopen函数
#include <dlfcn.h>
void *dlopen(const char *filename, intflag);
第一个参数:常量字符串形式的文件名,共享库文件名
第二个参数:标志位
RTLD_LAZY 延迟加载
RTLD_NOW 立即加载
返回值:
成功返回共享库的句柄,失败返回NULL
函数功能:
主要用于加载第一个参数指定的共享文件
注意:
在编译链接时增加选项:-ldl
(2)dlsym函数
void* dlsym(void* handle, const char*symbol);
第一个参数:
共享库句柄,dlopen函数的返回值
第二个参数:
字符串形式的符号,一般指定函数名
返回值:
成功返回符号在内存中的地址,失败返回NULL
函数功能:
根据句柄和符号来查找symbol在内存中的地址
(3)dlclose函数
int dlclose(void* handle);
函数功能:
主要用与关闭参数指定的共享库
返回值:
成功返回0,失败返回非0
(4)dlerror函数
char *dlerror(void);
函数功能:
主要功能用于获取dlopen()/dlsym()/dlclose()调用之后的最后一个错误信息,如果没发生错误,则返回NULL
新闻热点
疑难解答