C 如何动态加载自己的库并调用其中的方法?

C 如何动态加载自己的库并调用其中的方法?,c,linux,function,shared-libraries,C,Linux,Function,Shared Libraries,我想编写一些C代码(如果它只在Linux上工作就可以了)来动态加载一个新的共享库,然后从中调用一个方法(在运行时确定)。这似乎已经成为可能,因为java可以动态加载本机库,然后从中调用方法 例如,我想做如下事情: int main() { libinfo_t * lib_details = load_shared_library("libfoo.so"); run_method(lib_details, "bar", 7); } 这将使用参数7调用方法“bar”(bar是编译成

我想编写一些C代码(如果它只在Linux上工作就可以了)来动态加载一个新的共享库,然后从中调用一个方法(在运行时确定)。这似乎已经成为可能,因为java可以动态加载本机库,然后从中调用方法

例如,我想做如下事情:

int main() {
    libinfo_t * lib_details = load_shared_library("libfoo.so");
    run_method(lib_details, "bar", 7);
}
这将使用参数7调用方法“bar”(bar是编译成libfoo.so的方法)

用例详细信息:

我想编译一个二进制文件,加载目录中的所有共享库,并在原始程序的内存上下文中从每个库运行一些方法。我希望能够通过在目录中添加/删除共享库来快速启用或禁用它

概念证明:

基于java管理与jni代码动态链接的方式,这似乎是可能的。您可以使用System.load(),并加载您选择的库。再加上从内存编译,它似乎允许您从任意库运行任意函数

我尝试过的事情:

  • 我已经查看了“uselib”的手册页,它似乎很有用,但我不确定加载库后该如何处理它

  • 返回了一点谷歌搜索,但这并不是我所需要的——这个项目仍然需要一个函数指针来进行函数调用


  • 即使没有具体的答案,我也会很感激任何关于下一步行动方向的指示。谢谢

    Linux为此提供了一个非常完整的API。这是API

    首先,使用文件名调用
    dlopen
    ,以获取共享库句柄:

    void* lib = dlopen("./lib.so");
    
    然后,要获取此库中函数的函数指针,请执行以下操作:

    int (*func)() = dlsym(lib, "thing");
    
    请随意使用这个指针

    最后,完成后:

    dlclose(lib)
    

    注意:记得做错误检查

    哇,谢谢你的快速回复!听起来和我要找的一模一样。@jstrom:当然!很乐意帮忙。顺便说一句,欢迎来到SO!好的,第一个问题。希望你回来!看起来你也读了FAQ--yay!:)。您可能希望在路径中放置一个
    /
    ,例如
    dlopen(“./lib.so”)
    否则
    LD\u LIBRARY\u PATH
    或使用其内置等效项。C没有方法,只有函数。