在Ubuntu下编译CUDA示例时为什么找不到libcudart.so.4?

27

我正在尝试运行我的Cuda SDK示例,但是我遇到了以下错误:

./bandwidthTest: error while loading shared libraries:
                 libcudart.so.4: cannot open shared object file:
                 No such file or directory
为什么我可以成功编译这个例子,但无法运行它?有没有办法手动指定CUDA运行时库的路径?

你是如何编译代码的? - Adam27X
看起来库可能已被重命名,在 /usr/lib 文件夹中是否有任何名称带有 "libcudard" 的东西? - user406009
你尝试编译代码时是否遇到了这个错误?还是在运行时遇到的?如果是在编译时遇到,请发布你发送给 g++ 的参数。如果是在运行时遇到,那么我认为这个问题不适合在SO上讨论。 - Drew Chapin
@sj755我不能,它只是进入文件夹然后退出,而且由于某种原因我无法删除文件。 - Alex
@Alex,我好像忘了编译SDK的一些细节。我会发布一个答案。另外,你应该开始将文件夹称为目录。在CUDA 5发布之前,你可能需要从终端运行编译命令。 - sj755
显示剩余5条评论
8个回答

80

尝试执行以下命令:

32位系统: sudo ldconfig /usr/local/cuda/lib

64位系统: sudo ldconfig /usr/local/cuda/lib64

祝好运!


哇,谢谢。我之前在使用Theano时遇到了这个问题:“Failed to compile cuda_ndarry.cu: libcublas.so.6.0: cannot open shared object file: No such file or directory”,但现在已经解决了:D - Will Beauchamp
1
这与export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64有关吗? - SolessChong
运行时出现错误,但仍然解决了问题!谢谢! - Gu1234
对我很有效,我在Ubuntu 15.04上使用Caffe时遇到了问题:“libcudnn.so.4:无法打开共享对象文件:没有那个文件或目录”,这解决了它,非常感谢! - Ocxs
我在Debian 8.5中遇到了相同的问题。在我的情况下,我通过nvidia-cuda-toolkit软件包安装了cuda(它安装了cuda 6.0),但未在/usr/local中安装cuda。命令'dpkg -L libcudart6.0'报告库位于/usr/lib/x86_64-linux-gnu/libcudart.so.6.0。然后我运行'sudo ldconfig /usr/lib/x86_64-linux-gnu',这对我有用。 - valerio_sperati

13

首先,您需要将CUDA二进制文件和库的路径连接起来。只需将以下行添加到您的.bashrc文件中即可完成此操作。

export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=:/usr/local/cuda/lib64
如果您使用的是32位操作系统,请将lib64更改为lib。
其次,根据您的操作系统,在/usr/lib或/usr/lib64中应安装了一些共享对象文件。这些对象文件应该包含在一个名为“nvidia”的目录中。我们关心的两个文件名分别为libcuda.so.drivernumber和libOpenCL.so.somenumber。为了区分实际的共享对象文件,只需使用ls -l命令即可。符号链接将显示它们实际连接到的内容。
以root身份执行以下命令:
ln -s /usr/lib64/nvidia/libcuda.so.somenumber /usr/lib64/libcuda.so
ln -s /usr/lib64/nvidia/libOpenCL.so.somenumber /usr/lib64/libOpenCL.so

这将使您能够编译SDK中的所有源代码。

从Cuda 5.5和Ubuntu 12.04/12.10开始,64位系统的命令应该如下所示(请注意Ubuntu和Cuda目录的更改)

ln -s /usr/local/cuda/lib64/libcuda.so.5.5 /usr/lib/libcuda.so.5.5

也就是说,在Ubuntu 12.04上,lib文件夹分为lib32和lib两个,64位的已经默认包含在内,而cuda 5.5及以上版本现在会安装到不同的目录下。


ln:创建符号链接 `/usr/lib/libcuda.so':文件已存在 - Alex
符号链接对我不起作用。 ln -s /usr/lib/nvidia/libcuda.so.295.41 /usr/lib/libcuda.so ln -s /usr/lib/nvidia/libOpenCL.so.1.0.0 /usr/lib/libOpenCL.so - Alex
@Alex 你能否确定 /usr/lib/libcuda.so 是否为符号链接以及它所链接的内容。如果它链接到正确的位置,那么尝试创建一个指向 OpenCL 共享对象文件的符号链接,如果它不存在的话。 - sj755

6

加载共享库时出现1个错误:libcudart.so.6.0: 无法打开共享对象文件:没有那个文件或目录

  32-bit: sudo ldconfig /usr/local/cuda/lib

  64-bit: sudo ldconfig /usr/local/cuda/lib64

我明白了,翻译如下:

(参考: http://blog.csdn.net/shenchong721/article/details/21529295)

适用于我!


1
我收到了这个错误 $ sudo ldconfig /usr/local/cuda-7.5/lib64 /sbin/ldconfig.real:/usr/local/cuda-7.5/lib64/libcudnn.so.4 不是符号链接。 - Mona Jalal

5

LD_LIBRARY_PATH已被强烈废弃。它可能会干扰其他程序,也可能被其他程序重置。它应该仅用于临时覆盖永久路径以进行测试目的(不信,请谷歌)。

相反,将您的cuda库目录添加到/etc/ld.so.conf中的一行中,在任何现有行之后。

例如,如果您安装在/usr/local/cuda上,则需要添加

32位:/usr/local/cuda/lib

64位:/usr/local/cuda/lib64

保存并运行ldconfig。这应该永久修复问题。

符号链接可能已经由安装设置好了。如果没有,请按照Alex建议的添加。

注意-我收到引用/lib的错误,但我需要添加lib64来解决它们。


2

在/etc/ld.so.conf.d/中创建一个nvidia_settings.conf文件,并在该文件中添加库的路径。

 /usr/local/cuda/lib64
 /usr/local/cuda/lib

现在要更新更改,请运行以下命令:

sudo ldconfig

1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib

或者如果您在64位机器上运行cuda-5.0

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-5.0/lib64

0
在我的情况下,我正在使用MPI运行一个应用程序。错误是:
libcudart.so.7: cannot open shared object file

CUDA已在所有节点中正确安装。 此外,与先前的答案一样,变量$PATH和$LD_LIBRARY_PATH分别指向二进制文件和库。

在MPI命令中传递$PATH和$LD_LIBRARY_PATH解决了该问题。

mpirun -x PATH=$PATH -x LD_LIBRARY_PATH=$LD_LIBRARY_PATH ...

0

系统使用ld工具查找库。正如顶部答案所说,64位:sudo ldconfig /usr/local/cuda-xx/lib64 ;;xx是cuda库版本


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接