C ++ linux:dlopen无法find.so库

重写的问题(虽然已经解决了):

我一直在使用dlopen(3)在Linux上加载共享库。 这个库是由我构build的一个库系统的一部分,它们都是在运行时由中央可执行文件加载的。 所有这些都在Code :: Blocks中组织成一个工作区,每个项目在一个名为Source的目录中都有自己的文件夹,这个目录将随程序一起提供。 可执行文件的构build目录是两个从它自己的源代码向后的目录,所以exectuable和Source文件夹在同一个目录中,这些库也和可执行文件一样构build到同一个目录,所以自然我就传递了这个库的名字我试图打开如图所示:

int main(int argc, char** argv) { void* hLibrary = dlopen("libLibrary.so", RTLD_NOW | RTLD_GLOBAL); if(hLibrary == NULL) { fprintf(stderr, "%s\n", dlerror()); return 1; } return 0; } 

当构build目录与源代码相同时,这一点起作用,直到我将源代码的目录改变为上述安排。 现在的问题是dlerror()返回“无法打开libLibrary.so:没有这样的文件或目录”,即使该文件明显存在并且与可执行文件在同一目录中。 然后我尝试传入“/libLibrary.so”,因为根据dlopen(3)上的手册页,添加/表示相对目录。 这返回了同样的错误。

解决这个问题的方法是需要一个“./” – “”。 表示可执行文件的工作目录 – 并且需要在Code :: Blocks中将工作目录更改为可执行文件的构build目录。 以下作品完美:

 void* hLibrary = dlopen("./libLibrary.so", RTLD_NOW | RTLD_GLOBAL); 

这并不能真正显示完整的解决scheme,但以下基本上与我正在做的事情相同:

 void* hLibrary = dlopen("./../../libLibrary.so", RTLD_NOW | RTLD_GLOBAL); 

希望这可以更好地解释情况。

阅读dlopen(3)手册页(例如,通过在机器上的终端键入man dlopen ):

如果filename包含一个斜杠(“/”),则它被解释为(相对或绝对)路径名。 否则,动态链接程序按以下方式搜索库(有关更多详细信息,请参阅ld.so(8)):

  o (ELF only) If the executable file for the calling program contains a DT_RPATH tag, and does not contain a DT_RUNPATH tag, then the directories listed in the DT_RPATH tag are searched. o If, at the time that the program was started, the environment variable LD_LIBRARY_PATH was defined to contain a colon-separated list of directories, then these are searched. (As a security measure this variable is ignored for set-user-ID and set-group-ID programs.) o (ELF only) If the executable file for the calling program contains a DT_RUNPATH tag, then the directories listed in that tag are searched. o The cache file /etc/ld.so.cache (maintained by ldconfig(8)) is checked to see whether it contains an entry for filename. o The directories /lib and /usr/lib are searched (in that order). 

所以你需要调用dlopen("./libLibraryName.so", RTLD_NOW) – 不只是dlopen("libLibraryName.so", RTLD_NOW) ,它希望你的插件在/usr/lib/ etc中的$LD_LIBRARY_PATH中。 – 或添加. 到您的LD_LIBRARY_PATH (我不建议出于安全原因)。

正如Jhonnash回答你应该使用并显示dloror (或dlsym )失败时的结果:

  void* dlh = dlopen("./libLibraryName.so", RTLD_NOW); if (!dlh) { fprintf(stderr, "dlopen failed: %s\n", dlerror()); exit(EXIT_FAILURE); }; 

您可能需要阅读“ 高级Linux编程”等书籍,以获得有关Linux系统编程的一些知识。

关于dlopen的定义; 动态库dlopen错误可以被检查。 未定义的符号错误通过此链接 。