Cuda 5.0链接问题

时间:2012-07-10 22:08:56

标签: cuda linker-errors

我正在尝试使用cuda 5.0预览来构建我的旧项目。 链接时出现错误,告诉我无法找到某些cuda函数。例如:

undefined reference to 'cudaMalloc'

我的链接命令包括cuda的以下选项:

  

-L / usr / local / cuda / lib64 -L / home / myhome / NVIDIA_CUDA_Samples / C / lib -L ​​/ home / myhome / NVIDIA_CUDA_Samples / C / common / lib / linux -lcudart

ls -lah /usr/local/cuda/lib64/给了我8个cuda库,包括libcudart.so.5.0.7,只有.so文件结尾的符号链接。

ls /home/myhome/NVIDIA_CUDA_Samples/C/lib/给了我一个空目录,这有点奇怪吗?

ls /home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux/给了我两个目录:i686和x86_64都只包含libGLEW.a

我不知道寻找解决方案的方法。任何帮助表示赞赏!

编辑:

这是我的完整链接命令(TARGET_APPLICATION是我的二进制文件,x86_64 / Objectfiles.o代表所有(23)个目标文件,包括用nvcc编译的目标文件):

/home/myhome/nullmpi-0.7/bin/mpicxx -CC=g++ -I. -I/home/myhome/nullmpi-0.7/src -I/usr/lib/openmpi/include -L/usr/local/cuda/lib64 -L/home/myhome/NVIDIA_CUDA_Samples/C/lib -L/home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux -lcudart -o TARGET_APPLICATION x86_64/Objectfiles.o /usr/lib/liblapack.so /usr/lib/libblas.so /home/myhome/nullmpi-0.7/lib/libnullpmpi.a -lm

我使用nullmpi进行编译和链接(项目使用MPI和CUDA),内部使用g++-CC=g++可以看到,我想保留这些东西。< / p>

我的cuda目标文件的编译命令:

/usr/local/cuda/bin/nvcc -c -arch=sm_21 -L/home/myhome/NVIDIA_CUDA_Samples/C/lib -O3 kernelwrapper.cu -o x86_64/kernelwrapper.RELEASE.2.o

echo $LD_LIBRARY_PATH导致:

  

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

echo $PATH导致:

  

otherOptions :/usr/local/cuda/bin:/home/myhome/nullmpi-0.7/bin

我正在构建64位。为了完整起见,我正在使用Ubuntu 12.04。 (64位)。 构建CUDA样本工作正常。

解决方案(感谢talonmies指点我):

这是正确的链接命令:

/home/myhome/nullmpi-0.7/bin/mpicxx -CC=g++ -I. -I/home/myhome/nullmpi-0.7/src -I/usr/lib/openmpi/include -L/usr/local/cuda/lib64 -L/home/myhome/NVIDIA_CUDA_Samples/C/lib -L/home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux -o TARGET_APPLICATION x86_64/Objectfiles.o /usr/lib/liblapack.so /usr/lib/libblas.so /home/myhome/nullmpi-0.7/lib/libnullpmpi.a -lcudart -lm

1 个答案:

答案 0 :(得分:4)

您的链接语句的顺序不正确。它应该是更像这样的东西:

/home/myhome/nullmpi-0.7/bin/mpicxx -CC=g++ -I. -I/home/myhome/nullmpi-0.7/src \
    -I/usr/lib/openmpi/include -L/usr/local/cuda/lib64  \
    -L/home/myhome/NVIDIA_CUDA_Samples/C/lib \ 
    -L/home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux \ 
    -o TARGET_APPLICATION x86_64/Objectfiles.o \
     /home/myhome/nullmpi-0.7/lib/libnullpmpi.a -llapack -lblas -lm -lcudart

您的问题的根源是您在包含对其的依赖项的目标文件之前指定了CUDA运行时库。链接器只是从链接中丢弃libcudart.so,因为它在处理时没有依赖关系。 POSIX样式编译语句中的黄金法则:从左到右解析链接语句;所以首先包含外部依赖关系的对象,之后满足这些依赖关系的库。