nvcc选择了错误的libcudart库

nvcc选择了错误的libcudart库,cuda,linker,linker-errors,loader,nvcc,Cuda,Linker,Linker Errors,Loader,Nvcc,当我尝试用gpu模式导入theano时,就会出现这个问题。在导入theano时,它会尝试编译一些代码,创建一个共享的代码库并尝试加载它。 下面是生成so文件的命令 nvcc -shared -O3 -m64 -Xcompiler -DCUDA_NDARRAY_CUH=mc72d035fdf91890f3b36710688069b2e,\ -DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION,-fPIC,-fvisibility=hidden -Xlinker

当我尝试用gpu模式导入theano时,就会出现这个问题。在导入theano时,它会尝试编译一些代码,创建一个共享的代码库并尝试加载它。 下面是生成so文件的命令

nvcc -shared -O3 -m64 -Xcompiler -DCUDA_NDARRAY_CUH=mc72d035fdf91890f3b36710688069b2e,\
  -DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION,-fPIC,-fvisibility=hidden -Xlinker \
  -rpath,/home/jay/.theano/compiledir_Linux-4.8--ARCH-x86_64-with-arch-Arch-Linux--3.6.0-64/cuda_ndarray \
  -I/usr/lib/python3.6/site-packages/Theano-0.9.0b1-py3.6.egg/theano/sandbox/cuda \
  -I/usr/lib/python3.6/site-packages/numpy-1.13.0.dev0+72839c4-py3.6-linux-x86_64.egg/numpy/core/include \
  -I/usr/include/python3.6m -I/usr/lib/python3.6/site-packages/Theano-0.9.0b1-py3.6.egg/theano/gof \
  -L/usr/lib -o /home/jay/.theano/compiledir_Linux-4.8--ARCH-x86_64-with-arch-Arch-Linux--3.6.0-64/cuda_ndarray/cuda_ndarray.so \
   mod.cu -lcublas -lpython3.6m 
它成功编译了,但找不到
cudart
的正确库。
ldconfig
似乎知道此库的位置,这是正确的

$ ldconfig -p | grep libcuda
    libcudart.so.8.0 (libc6,x86-64) => /opt/cuda/lib64/libcudart.so.8.0
    libcudart.so (libc6,x86-64) => /opt/cuda/lib64/libcudart.so
    libcuda.so.1 (libc6,x86-64) => /usr/lib/libcuda.so.1
    libcuda.so (libc6,x86-64) => /usr/lib/libcuda.so
但是,当我检查库时,它指出了
libcudart
的问题

$ ldd cuda_ndarray.so  | grep cuda
    libcublas.so.8.0 => /opt/cuda/lib64/libcublas.so.8.0 (0x00007f006dd1b000)
    libcudart.so.7.5 => not found
读取elf头

$ readelf -a cuda_ndarray.so | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libcublas.so.8.0]
 0x0000000000000001 (NEEDED)             Shared library: [libpython3.6m.so.1.0]
 0x0000000000000001 (NEEDED)             Shared library: [libcudart.so.7.5]
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
什么地方出了问题,导致它选择了错误的库,
cudart7.5
,而不是
cudart8.0

这是我的
nvcc-V

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Sun_Sep__4_22:14:01_CDT_2016
Cuda compilation tools, release 8.0, V8.0.44
我的
libcudart.so
指向正确的库版本

$ ls -la | grep libcudart
lrwxrwxrwx  1 root root        16 Jan 10 06:10 libcudart.so -> libcudart.so.8.0
lrwxrwxrwx  1 root root        19 Jan 10 06:10 libcudart.so.8.0 -> libcudart.so.8.0.44
-rwxr-xr-x  1 root root    415432 Jan 10 06:10 libcudart.so.8.0.44
-rw-r--r--  1 root root    775162 Jan 10 06:10 libcudart_static.a

还有一个更普遍的问题,链接器如何解析输入的实际文件位置,如
-lm
-lcudart
或编译时使用的任何速记符号

我尝试了cuda附带的两个示例程序,其中包括
libcudart

$ grep -rnw . -e 'lcudart'
./3_Imaging/cudaDecodeGL/Makefile:329:LIBRARIES += -lcudart -lnvcuvid
./0_Simple/simpleMPI/Makefile:284:LIBRARIES += -L$(CUDA_PATH)/lib$(LIBSIZE) -lcudart
在这两个系统中,
simpleMPI
运行时没有出现错误

$ ./simpleMPI 
Running on 1 nodes
Average of square roots is: 0.667242
PASSED
另一个因先前的错误而失败

$ ./cudaDecodeGL 
./cudaDecodeGL: error while loading shared libraries: libcudart.so.7.5: cannot open shared object file: No such file or directory

我在旧安装的
CUDA7.5
之上安装了
CUDA8
,因此它将旧的cuda库移动到
cuda/lib64/stubs
。删除该目录后,一切正常。

您的CUDA安装一定是坏掉了。您要链接的/opt/cuda/lib64/libcudart.com是什么?那么您使用的nvcc版本是什么?@Talonmes我认为我的CUDA安装没有中断,为了回答您的问题,我已经修改了我的问题。因此,如果您从命令行编译CUDA hello world,所有内容都链接并正常运行?在这种情况下,您正在编译或链接的内容必须依赖于CUDA be 7.5,例如Theano Stuff链接器如何解析输入的实际文件位置,如-lm或-lcudart或编译时使用的任何速记符号?你有什么好的参考资料吗?我认为在你的机器上编译cudaDecodeGL示例时也会以同样的方式失败(你的nvcc版本显然是8.0,但编译过程对libcudart.so(CUDA 7.5)有依赖性)这一事实强烈地表明你的CUDA安装失败了。你可能有像
nvcc
这样的CUDA工具或者像libcudart这样的CUDA库分散在你的机器上(例如,CUDA应该在/usr/local/CUDA中,但你可能在/opt或/usr/lib中有东西),并且某种搜索路径选择了错误的工具或库。事实上,你是这样做的,有一个损坏的CUDA安装。。请记住几天后回来接受此回答sp它会从CUDA标记的未应答队列中脱落安装程序不会将旧的CUDA库移动到CUDA/lib64/stubs。即使在干净的系统上新安装了CUDA 8,该目录也会出现,删除它意味着您的CUDA 8安装现在因某些任务而中断。感谢Robert的澄清。我没有删除那个目录,但把一些移到了别的地方,必要时我可以移回那个目录。这意味着我的问题实际上没有得到解决。你能解释一下
-lcudart
是如何得到解决的吗?我们将其传递给nvcc?