我试图通过编译目标文件然后将它们链接在一起来编译项目,没什么好看的:
hello.o : hello.h hello.cu
nvcc hello.cu -c -o hello.o
#...
main.o : $(objs)
nvcc *.o -o exec
当我进入链接阶段时,几乎所有方法都显示为缺失和未声明,尽管事实上nm显示每个方法实际上都位于我的目标文件中,并且它们的名称是未标记的。这里发生了什么?
答案 0 :(得分:0)
你的最终make
目标看起来很虚伪:不应该说:
exec : $(objs)
nvcc $(objs) -o $@
您可能还需要将CUDA库添加到命令行(我认为nvcc
在您直接编译.cu
文件时会想到这一点,但如果您可能不这样做只需给它.o
个文件)。所以,更像这样的事情:
exec : $(objs)
nvcc $(objs) -o $@ -lcuda -lcudart -lcublas
(确切地说,您需要哪些库取决于您的代码)
答案 1 :(得分: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。当我为我的方法的名称搜索'nm * .o'时,我发现gcc发出的目标文件具有未编码的名称,而由.g ++编译的.cu文件则预期会出现损坏的名称。
我的解决方案是将项目中的所有.c文件重命名为.cu,尽管我认为(但尚未测试)将它们保留为.c并在makefile中显式调用g ++应该就足够了。
答案 2 :(得分:0)
我试过调用g ++但仍然遇到了同样的错误。答案在这里找到:
http://forums.nvidia.com/index.php?showtopic=190973&st=0&gopid=1179661&#entry1179661
简而言之,功能原型需要正确。