【问题标题】:Linux dlerror returning error message from dlopen that I can't explainLinux dlerror 从 dlopen 返回我无法解释的错误消息
【发布时间】: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

标签: c++ linux dlopen


【解决方案1】:

结果是可执行文件指向 32 位库,而它本应指向 64 位库。我给所有评论的人打分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多