NVCC拒绝链接我的目标文件

时间:2010-07-07 16:04:44

标签: linker cuda nvcc

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

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

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

3 个答案:

答案 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

简而言之,功能原型需要正确。