我想通过编译的目标文件,然后将它们连接在一起,没有什么花哨编译项目:NVCC拒绝将我的目标文件
hello.o : hello.h hello.cu
nvcc hello.cu -c -o hello.o
#...
main.o : $(objs)
nvcc *.o -o exec
当我到链接阶段,几乎所有的方法虽然nm显示每个实际上都在我的目标文件中,并且它们的名字没有被打乱,但是显示为丢失并且未声明。这里发生了什么?
我想通过编译的目标文件,然后将它们连接在一起,没有什么花哨编译项目:NVCC拒绝将我的目标文件
hello.o : hello.h hello.cu
nvcc hello.cu -c -o hello.o
#...
main.o : $(objs)
nvcc *.o -o exec
当我到链接阶段,几乎所有的方法虽然nm显示每个实际上都在我的目标文件中,并且它们的名字没有被打乱,但是显示为丢失并且未声明。这里发生了什么?
好了,我的问题的提法是不正确的。事实上,问题是我正在编译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发出的目标文件具有unmangled名称,而由g ++编译的.cu文件预计会出现重名。
我的解决方案是将我的项目中的所有.c文件重命名为.cu,但我认为(但没有测试过)将它们保留为.c并在makefile中显式调用g ++就足够了。
你的最终目标make
看起来假:它不应该说:
exec : $(objs)
nvcc $(objs) -o [email protected]
您可能还需要在CUDA库添加到命令行(我觉得nvcc
数字了这一点,当你编译一个.cu
文件直接,但也许它不会,如果你只是给它.o
文件)。所以,更多的东西是这样的:
exec : $(objs)
nvcc $(objs) -o [email protected] -lcuda -lcudart -lcublas
(准确地说是哪些库需要取决于你的代码)
我试着调用g ++,但仍然得到相同的错误。答案在这里找到:
http://forums.nvidia.com/index.php?showtopic=190973&st=0&gopid=1179661&#entry1179661
总之,函数原型必须是正确的。
FWIW,得到了这个Q&A,因为我想弄清楚如何通过'g ++'链接器(它似乎没有意识到这些损坏的名称)从C中调用重名的名称。 – ragerdl 2018-02-25 06:09:36