代码之家  ›  专栏  ›  技术社区  ›  mac01021

在Unix中编程:与库共享库

  •  3
  • mac01021  · 技术社区  · 16 年前

    在C中,在Unix之上,我正在加载和使用共享库,具体如下:

    ...
    
    handle = dlopen("nameOfLib");
    
    ...
    
    libInit();
    
    ...
    
    libGoToState1();
    
    
    libGoToState2();
    
    
    ....
    
    libTerminate();
    
    ...
    
    dlclose(handle);
    
    ...
    

    我想让我的应用程序接受“插件”,它采用动态可加载库的形式,并遵循给定的API。

    棘手的是我想在调用后加载一个插件 libInit() 我希望插件能够调用 libGoToSomeOtherState() ,更改库的状态,但使用与加载它的应用程序相同的“会话”。

    对于我需要如何进行编码的任何想法,我都表示感谢。

    具体来说,为了让插件和主程序共享库实例、状态和所有内容,需要在.c文件中输入什么?

    4 回复  |  直到 16 年前
        1
  •  1
  •   Andy Ross    16 年前

    导出插件要使用的接口的标准方法是将该接口本身放入插件链接到的共享库中,或者将插件传递一个函数指针结构(大概在libinit()中),然后使用该结构来完成工作。

        2
  •  2
  •   Dana    16 年前

    我不确定这是否正是你想要的,但是一篇关于如何为C程序创建简单插件的文章几天前在Reddit上发表了:

    http://thisxorthat.blogspot.com/2010/01/choose-indecision-simple-plugins-in-c.html

        3
  •  1
  •   caf    16 年前

    插件可以调用 dlsym(RTLD_DEFAULT, "libGoToSomeOtherState") 要获取它想要调用的函数的地址,或者可以直接将该函数指针传递给插件的init例程(可能在此类函数指针的表中)。

        4
  •  0
  •   lorenzog    16 年前

    作为一个简短的提示,我建议使用回调:要么将库句柄传递给插件,要么在插件内部使用函数指针来调用原始库函数。