不会飞的鸟

2010年12月10日 ... 不鸟他们!!! 我要用自己开发的分布式文件系统、分布式调度系统、分布式检索系统, 做自己的搜索引擎!!!大鱼有大志!!! ---杨书童

Linux下动态加载动态库,更新动态库而不用更新程序

linux下动态加载动态库,主要用到dlopen(),dlsym(),dlclose(),dlerror()四个函数,他们所使用的头文件#include <dlfcn.h>
在这里主要介绍一下dlopen()函数

dlopen()  功能:打开一个动态链接库

  包含头文件:

  #include <dlfcn.h>

  函数定义

  void * dlopen( const char * pathname, int mode );

  函数描述:

  在dlopen的()函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。

  mode:分为这两种

  RTLD_LAZY 暂缓决定,等有需要时再解出符号

  RTLD_NOW 立即决定,返回前解除所有未决定的符号。

  RTLD_LOCAL

  RTLD_GLOBAL 允许导出符号

  RTLD_GROUP

  RTLD_WORLD

  返回值:

  打开错误返回NULL

  成功,返回库引用

  编译时候要加入 -ldl (指定dl库)

  例如

  gcc test.c -o test -ldl


下面举个例子,同时考虑到几个细节。


/***********************main.c的内容**************************/
#include<stdio.h>
#include<dlfcn.h>
int main()
{
    int a,b;
    void *pHandle;
   
typedef int (*func)(int,int);   //注意函数的定义,这里要根据下面的max函数格式定义。
    scanf("%d%d",&a,&b);
    pHandle=dlopen("./dl2.so",RTLD_NOW);
    if (!pHandle)
    {
            cerr << "Cannot open library: " << dlerror() << ' ';
            return 1;
    }
   
    func=(func)dlsym(pHandle,"max");
    const char *dlsym_error = dlerror();
    if (dlsym_error) {
            cerr << "Cannot load symbol 'baidu': " << dlsym_error <<' ';
            dlclose(pHandle);
            return 1;
    }

    printf("%d与%d相比,%d为大数。\n",a,b,(*func)(a,b));
    dlclose(pHandle);
}
/***********************main.c的内容**************************/

/***********************testmax.c的内容**************************/
#include<stdio.h>
int max(int x,int y)
{
    return x>y?x:y;
}
/***********************testmax.c的内容**************************/

编译:
gcc testmax.c -shared -fPIC -o testmax.so
gcc -o main -ldl main.c

运行:
admin@admin-desktop:/abc/test$ ./main
2008 2012
2008与2012相比,2012为大数。


很浅层的东西,这样下次你直接修改你的testmax.c文件,编译成动态库拷贝到main目录,不用编译,直接可以加载你最新修改的testmax中的函数,前提是函数名、格式要相同

posted on 2012-03-26 15:53 不会飞的鸟 阅读(2851) 评论(1)  编辑 收藏 引用

评论

# re: Linux下动态加载动态库,更新动态库而不用更新程序 2012-03-26 15:58 不会飞的鸟

补充一下,所使用的动态库必须按照 extern "C"的方式定义,否则要出问题。

生成动态链接库是否必须使用 -fPIC 的问题
http://hi.baidu.com/han_zhi_xing/blog/item/08f0ef37a50409360a55a9b4.html  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理