首页 > 学院 > 开发设计 > 正文

linux_3 库文件的使用

2019-11-08 01:56:49
字体:
来源:转载
供稿:网友

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表