我试图通过编译目标文件然后将它们链接在一起来编译一个项目,没什么特别的:
hello.o : hello.h hello.cu
nvcc hello.cu -c -o hello.o
#...
main.o : $(objs)
nvcc *.o -o exec
当我进入链接阶段时,几乎所有方法都显示为丢失和未声明,尽管 nm 显示每个方法实际上都位于我的目标文件中,并且它们的名称未损坏。这里发生了什么?
您的最终make
目标看起来很虚假:它不应该说:
exec : $(objs)
nvcc $(objs) -o $@
您可能还需要将 CUDA 库添加到命令行(我认为nvcc
在您.cu
直接编译文件时会解决这个问题,但如果您只是给它文件可能不会.o
)。所以,更像这样的东西:
exec : $(objs)
nvcc $(objs) -o $@ -lcuda -lcudart -lcublas
(具体需要哪些库取决于您的代码)
好的,所以我的问题的表述不正确。事实上,问题在于我正在编译 C 代码,如下所示:
hello.o : hello.h hello.cu
nvcc hello.c -c -o hello.o
#...
main.o : $(objs)
nvcc *.o -o exec
这导致 nvcc 将 .c 文件传递给 gcc。当我 grep 'nm *.o' 作为我的方法的名称时,我发现 gcc 发出的目标文件具有未损坏的名称,而由 g++ 编译的 .cu 文件预期的名称已损坏。
我的解决方案是将项目中的所有 .c 文件重命名为 .cu,尽管我认为(但尚未测试)将它们保留为 .c 并在 makefile 中显式调用 g++ 就足够了。
我尝试调用 g++ 但仍然遇到相同的错误。答案在这里找到:
http://forums.nvidia.com/index.php?showtopic=190973&st=0&gopid=1179661&#entry1179661
简而言之,函数原型需要是正确的。