Linker NVCC拒绝链接我的对象文件

Linker NVCC拒绝链接我的对象文件,linker,cuda,nvcc,Linker,Cuda,Nvcc,我试图通过编译对象文件并将它们链接在一起来编译项目,没有什么特别之处: hello.o : hello.h hello.cu nvcc hello.cu -c -o hello.o #... main.o : $(objs) nvcc *.o -o exec 当我进入链接阶段时,几乎每个方法都被显示为丢失和未声明,尽管nm显示每个方法实际上都位于我的对象文件中,并且它们的名称是不混合的。这是怎么回事 你的最终make目标看起来是假的:它不应该说: exec : $(objs)

我试图通过编译对象文件并将它们链接在一起来编译项目,没有什么特别之处:

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库添加到命令行中(我认为当您直接编译
.cu
文件时,
nvcc
会解决这个问题,但如果您只给它
.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。当我用“nm*.o”作为我方法的名称时,我发现gcc发出的对象文件的名称是不混合的,而由g++编译的.cu文件的名称应该是混乱的


我的解决方案是将项目中的所有.c文件重命名为.cu,尽管我认为(但尚未测试)将它们保留为.c并在makefile中显式调用g++就足够了

我尝试调用g++但仍然出现相同的错误。答案就在这里:


简而言之,功能原型必须是正确的。

我已经把这一行作为一个例子。你发布的内容和我实际拥有的差不多。我还链接了CUDA库。我的问题是链接阶段本身。链接者抱怨哪些符号?cu*个,还是应该来自您的代码?单独调用链接器是否有效?当你有了对象文件时,你应该不需要通过nvcc编译器driver.FWIW,因为我正试图找出如何通过
g++
链接器(它似乎不知道损坏的名称)从C调用损坏的名称。