在运行时按路径加载共享库

aRe*_*ess 23 c++ plugins shared-libraries

我正在构建一个Java应用程序,它使用用C++编写的共享库,并为不同的操作系统编译.问题是,这个共享库本身依赖于它通常在适当的环境变量(PATH,LIBRARY_PATHLD_LIBRARY_PATH)下找到的附加库.

我可以 - 但不想 - 设置这些环境变量.我宁愿在运行时从给定路径加载所需的共享库 - 就像插件一样.不 - 我不希望任何启动应用程序在新环境中启动新进程.有谁知道如何实现这一目标?

我知道这一定是可能的,因为我使用的库之一能够从给定路径加载其插件.当然我更喜欢与平台无关的代码,但如果不可能,Windows,Linux和MacOS的单独解决方案也会这样做.

编辑 我应该提到我希望使用的共享库是面向对象的,这意味着单个函数的绑定不会这样做.

joh*_*nes 27

您可以使用的Un UNIX/Linux系统dlopen.那么问题是你必须通过获取所需的所有符号dlsym

简单的例子:

typedef int (*some_func)(char *param);

void *myso = dlopen("/path/to/my.so", RTLD_NOW);
some_func *func = dlsym(myso, "function_name_to_fetch");
func("foo");
dlclose(myso);
Run Code Online (Sandbox Code Playgroud)

将加载.so并从那里执行function_name_to_fetch().有关更多信息,请参见手册页dlopen(1).


Ant*_*eru 11

在Windows上,您可以LoadLibrary在Linux上使用dlopen.API非常相似,可以通过提供完整路径直接加载so/dll.如果它是一个运行时依赖项(在加载后,你通过调用GetProcAddress/ "链接" dlsym).


thi*_*ton 7

我同意其他关于 dlopen 和 LoadLibrary 使用的海报。该的libltdl为您提供了一个独立于平台的接口,这些功能。