我正在尝试使用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
答案 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样式编译语句中的黄金法则:从左到右解析链接语句;所以首先包含外部依赖关系的对象,之后满足这些依赖关系的库。