0

我试图通过编译目标文件然后将它们链接在一起来编译一个项目,没什么特别的:

hello.o : hello.h hello.cu
    nvcc hello.cu -c -o hello.o
#...
main.o : $(objs)
    nvcc *.o -o exec

当我进入链接阶段时,几乎所有方法都显示为丢失和未声明,尽管 nm 显示每个方法实际上都位于我的目标文件中,并且它们的名称未损坏。这里发生了什么?

4

3 回答 3

1

您的最终make目标看起来很虚假:它不应该说:

exec : $(objs)
    nvcc $(objs) -o $@

您可能还需要将 CUDA 库添加到命令行(我认为nvcc在您.cu直接编译文件时会解决这个问题,但如果您只是给它文件可能不会.o)。所以,更像这样的东西:

exec : $(objs)
    nvcc $(objs) -o $@ -lcuda -lcudart -lcublas

(具体需要哪些库取决于您的代码)

于 2010-07-08T06:54:04.717 回答
0

好的,所以我的问题的表述不正确。事实上,问题在于我正在编译 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++ 就足够了。

于 2010-07-10T17:44:05.850 回答
0

我尝试调用 g++ 但仍然遇到相同的错误。答案在这里找到:

http://forums.nvidia.com/index.php?showtopic=190973&st=0&gopid=1179661&#entry1179661

简而言之,函数原型需要是正确的。

于 2011-01-19T11:58:00.537 回答