dlopen 找不到 ldconfig -p 找到的库

dlopen not finding library that ldconfig -p finds

我正在尝试绑定共享的 CUDA 库。作为快速验证,我编写了以下代码:

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char **argv) {
    void *handle;    
    handle = dlopen ("libcuda.so", RTLD_LAZY);
    if (!handle) {
        fputs (dlerror(), stderr);
        exit(1);
    }

    dlclose(handle);
}

失败 libcuda.so: cannot open shared object file: No such file or directory.

但是,如果我检查 ldconfig,我得到:

ldconfig -p | grep libcuda
        libcuda.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcuda.so.1
        libcuda.so.1 (libc6) => /usr/lib/i386-linux-gnu/libcuda.so.1
        libcuda.so (libc6) => /usr/lib/i386-linux-gnu/libcuda.so

所以看起来libcuda.so确实存在并且被系统看到了。那么为什么 dlopen() 失败了?

这是在 Ubuntu 14.04.

从你的ldconfig -p可以看出libcuda.so.1x86_64没有symlink,你只需要创建它,试试

sudo ln -svf /usr/lib/x86_64-linux-gnu/libcuda.so{.1,}

可能是您没有安装 -dev 软件包。

或干脆改变

handle = dlopen ("libcuda.so", RTLD_LAZY);

handle = dlopen ("libcuda.so.1", RTLD_LAZY);

但第一个解决方案更好,因为当您使用 -lcuda 动态地 link 到 libcuda.so.1 时,symlink 可能是强制性的。