改写的问题(虽然它已经解决了):
我在使用 dlopen(3) 在 linux 上加载共享对象库时遇到了麻烦。该库是我构建的库系统的一部分,这些库都在运行时由中央可执行文件加载。所有这些都被组织到 Code::Blocks 中的单个工作区中,每个项目在一个名为 Source 的目录中都有自己的文件夹,该文件夹将随程序一起提供。可执行文件的build目录是从自己的源代码倒过来的两个目录,这样可执行文件和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;
}
这在构建目录与源代码相同的时候起作用,直到我将源代码的目录更改为上述安排。此时的问题是 dlerror() 返回“无法打开 libLibrary.so:没有这样的文件或目录”,即使该文件明显存在并且与可执行文件位于同一目录中。然后我尝试传入“/libLibrary.so”,因为根据 dlopen(3) 上的手册页,添加 / 表示相对目录。这返回了相同的错误。
解决方案是需要一个“./” - 其中“.” 表示可执行文件的工作目录 - 并且需要在 Code::Blocks 中将工作目录更改为要构建可执行文件的位置。以下工作完美:
void* hLibrary = dlopen("./libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
这并没有真正显示完整的解决方案,但以下基本上相当于我正在做的事情:
void* hLibrary = dlopen("./../../libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
希望这能更好地解释这种情况。