【发布时间】:2015-02-04 19:13:27
【问题描述】:
我在使用 C++/Linux 中的 dlopen 函数时遇到问题。
void * hsiftgpu = dlopen("/full/path/libsiftgpu.so", RTLD_LAZY);
我假设 dlerror() 产生的任何错误都会告诉我无法找到/打开 libsiftgpu.so。这是我检查错误的代码:
if(hsiftgpu == NULL){
std::cout << "Could not load libsiftgpu.so" << '\n';
fprintf(stderr, "dlopen failed: %s\n", dlerror());
return 0;
}
相反,它告诉我:
dlopen failed: libcudart.so.6.5: cannot open shared object file: No such file or directory
我对 Linux 中的文件处理不是很熟悉,所以我可能会遗漏一些明显的东西。我想知道在调用 dlopen 之前是否需要重置某些内容,或者 libsiftgpu.so 正在调用 libcudart.so.6.5?不管怎样,这个错误信息对我来说没有多大意义。
我已尝试将路径添加到 LD_LIBRARY_PATH(尽管出于安全考虑不建议这样做,但我只是想看看它是否可行)和 /etc/lib.conf.so/ 我还检查了以确保可执行文件和 .so 库以相同的 ELF-64 格式编译。
我已经没有要检查的东西了,我无法解释错误消息。任何指导或可能的解释表示赞赏。
【问题讨论】:
-
如果您输入
ldd /full/path/libsiftgpu.so,您应该会找到libsiftgpu.so导入的所有库的列表。任何没有绝对路径的都必须找到并添加到您的LD_LIBRARY_PATH。可能还不止这些,可惜我在 Linux 上没有对库做太多工作。 -
我运行了 ldd 并且 libcudart.so.6.5 以绝对路径出现。但是,该文件是指向 libcudart.so.6.5.14 的符号链接(恰好位于同一目录中。如果我的可执行文件需要指向真实文件而不是链接,我不确定如何调整那个。
-
在 OS X 上,请参阅
install_name_tool。在 Linux 上,请参阅 nixos.org/patchelf.html