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.1
x86_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 可能是强制性的。
我正在尝试绑定共享的 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.1
x86_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 可能是强制性的。