C 如何动态加载自己的库并调用其中的方法?
我想编写一些C代码(如果它只在Linux上工作就可以了)来动态加载一个新的共享库,然后从中调用一个方法(在运行时确定)。这似乎已经成为可能,因为java可以动态加载本机库,然后从中调用方法 例如,我想做如下事情: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是编译成
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(),并加载您选择的库。再加上从内存编译,它似乎允许您从任意库运行任意函数
我尝试过的事情:
即使没有具体的答案,我也会很感激任何关于下一步行动方向的指示。谢谢 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没有方法,只有函数。