Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2036319
  • 博文数量: 610
  • 博客积分: 11499
  • 博客等级: 上将
  • 技术积分: 5511
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-12 19:27
文章分类

全部博文(610)

文章存档

2016年(5)

2015年(18)

2014年(12)

2013年(16)

2012年(297)

2011年(45)

2010年(37)

2009年(79)

2008年(101)

分类: LINUX

2011-06-23 12:37:55

(2011-06-22 14:51)


Linux 中的库层次结构。 

图 2. 静态链接与动态链接 
下面以一个简单的动态库为例讲解动态链接与动态加载方法:
动态库示例:
add.c
int add(int a,int b){

        return (a+b);
}
编译动态库:gcc -shared -o libadd.so add.c 生成 libadd.so

动态链接方法:在编译程序时,指定要链接的库文件即可,此时调用共享库只需要其头文件即可。
示例:
test.c
#include #include int add(int,int); int main(int argc, char *argv[]) { sum=add(10,11); printf("sum=%d",sum); }
编译程序:gcc -l add -o test test.c

-l 参数表示要链接的动态链接库,若路径不在标准库文件路径下可用-L 包含。
 
动态加载方法:通过下列API完成

函数 描述
dlopen 使对象文件可被程序访问
dlsym 获取执行了 dlopen 函数的对象文件中的符号的地址
dlerror 返回上一次出现错误的字符串错误
dlclose 关闭目标文件

示例:
test.c
#include
#include
int main(int argc, char *argv[])
{
        void *dl_handler=NULL;
        int (*func)(int,int);
        char *error;
        int sum;
        dl_handler = dlopen("add.so",RTLD_LAZY);
        if(!dl_handler)
        {
                printf("open:%s\n",dlerror());
                return 0;
        }
        func=dlsym(dl_handler,"add");
        error =dlerror();
        if(error!=NULL)
        {
                printf("find:%s\n",error);
                return 0;
        }
        sum=(*func)(10,11);
        printf("sum=%d",sum);
        dlclose(dl_handler);
}

编译程序:gcc -o test test.c -ldl

-ldl 表明将 dllib 链接于该程序,即可调用DL的API

共享库的路径:可以放在系统共享库目录:/usr/lib下,也可以通过环境变量LD_LIBRARY_PATH设置

版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
阅读(900) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~