0

这些命令是由我基本上从 NVIDIA 教程页面复制的 Makefile 程序生成的;它的长度超过 100 行,如果您认为有必要,它会发布,但这些命令足以重现错误。

g++ -m64  -I/usr/local/cuda/include -I. -I.. -I../../common/inc -I/usr/local/cuda/lib64 -o shallowwater.o -c shallowwater.cpp

/usr/local/cuda/bin/nvcc -m64  -gencode arch=compute_10,code=sm_10 -gencode arch=compute_20,code=sm_20 -I/usr/local/cuda/include -I. -I.. -I../../common/inc -I/usr/local/cuda/lib64 -o shallowwatercudamain.o -c shallowwatercudamain.cu

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -lcudart 

前两个工作;两个源文件中的任何一个都没有编译错误,但是当运行第三个命令时,出现以下错误:

shallowwatercudamain.o: In function `__cudaUnregisterBinaryUtil()':
tmpxft_00004e70_00000000-4_shallowwatercudamain.compute_20.cudafe1.cpp:(.text+0x36): undefined reference to `__cudaUnregisterFatBinary'
shallowwatercudamain.o: In function `__sti____cudaRegisterAll_66_tmpxft_00004e70_00000000_6_shallowwatercudamain_compute_20_cpp1_ii_runIt()':
tmpxft_00004e70_00000000-4_shallowwatercudamain.compute_20.cudafe1.cpp:(.text+0x46): undefined reference to `__cudaRegisterFatBinary'
collect2: ld returned 1 exit status
make: *** [shallowwater] Error 1

以下是一些相关的系统信息:

[foo@bar code]$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2012 NVIDIA Corporation
Built on Thu_Apr__5_00:24:31_PDT_2012
Cuda compilation tools, release 4.2, V0.2.1221
[foo@bar code]$ uname -a
Linux intel19 2.6.32-71.el6.x86_64 #1 SMP Wed Sep 1 01:33:01 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

我在这里发现了一个有类似错误的人,在这里看到:/usr/bin/ld: 找不到 -lcudart 我很尴尬地说我找到了这个,除了 g++ 而不是 gfortran 之外,我做了同样的改变,并且它有效。后来,我又试了一次,还是不行。我得到同样的错误:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -L/usr/local/cuda/lib64
4

2 回答 2

3

这个命令对我来说看起来不正确:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -lcudart 

这个命令对我来说看起来不正确:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -L/usr/local/cuda/lib64

这个命令对我来说很合适:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L/usr/local/cuda/lib64 -lcudart

您需要告诉 g++ 在哪里查找 cudart 库,这就是-L/usr/local/cuda/lib64开关的用途(因此它需要一个路径,您不能只使用-L它自己)并且您需要告诉 g++ 要使用的库的名称,即这-lcudart是为了什么。

于 2013-05-07T01:15:05.960 回答
1

我意识到您没有在最后一行中添加“-lcudart”。您在进行实际编译时是否链接到 cudart ?

于 2013-05-07T01:14:18.017 回答