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调用损坏的名称。