2012-07-10 58 views
1

我只是试图用cuda 5.0预览来构建我的旧项目。 链接时出现错误,告诉我某些cuda功能找不到。例如:Cuda 5.0链接问题

undefined reference to 'cudaMalloc'

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

-L在/ usr /本地/ CUDA/lib64下-L /家庭/ MYHOME/NVIDIA_CUDA_Samples/C/lib目录-L /家庭/ MYHOME/NVIDIA_CUDA_Samples/C/common/lib目录/ Linux的-lcudart

ls -lah /usr/local/cuda/lib64/给了我8个CUDA库,包括与仅使用的.so文件结束的符号链接libcudart.so.5.0.7。

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++,我想保留这些东西。

我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示例正常工作。

SOLUTION(感谢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

请提供您的完整命令行以及您是否正在编译32位或64位。 – harrism 2012-07-11 02:48:12

+0

这很奇怪。我通常不需要链接任何标准CUDA程序。你记得修改LD_LIBRARY_PATH吗? – sj755 2012-07-11 03:55:06

+0

我没有在您的编译行中看到任何源文件或对象... – harrism 2012-07-11 07:29:23

回答

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风格的编译语句中:链接语句从左向右被解析;因此首先包含外部依赖关系的对象,之后满足这些依赖关系的库。

+0

嗨,非常感谢您的帮助!我应该看看POSIX的规则,直到现在我很幸运地完成我的事情。奇怪的是:我在Ubuntu 11.10和Cuda 4.1上使用完全相同的Makefiles,并且没有任何问题。 – soriak 2012-07-11 09:54:09