2010-07-07 44 views
0

我想通过编译的目标文件,然后将它们连接在一起,没有什么花哨编译项目:NVCC拒绝将我的目标文件

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

当我到链接阶段,几乎所有的方法虽然nm显示每个实际上都在我的目标文件中,并且它们的名字没有被打乱,但是显示为丢失并且未声明。这里发生了什么?

回答

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发出的目标文件具有unmangled名称,而由g ++编译的.cu文件预计会出现重名。

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

+0

FWIW,得到了这个Q&A,因为我想弄清楚如何通过'g ++'链接器(它似乎没有意识到这些损坏的名称)从C中调用重名的名称。 – ragerdl 2018-02-25 06:09:36

0

你的最终目标make看起来假:它不应该说:

exec : $(objs) 
    nvcc $(objs) -o [email protected] 

您可能还需要在CUDA库添加到命令行(我觉得nvcc数字了这一点,当你编译一个.cu文件直接,但也许它不会,如果你只是给它.o文件)。所以,更多的东西是这样的:

exec : $(objs) 
    nvcc $(objs) -o [email protected] -lcuda -lcudart -lcublas 

(准确地说是哪些库需要取决于你的代码)

+0

我已经将该行作为示例。你发布的内容几乎与我的实际情况一致。我还链接到CUDA库。我的问题是与链接阶段本身。 – Alex 2010-07-08 16:11:39

+0

链接器抱怨哪些符号? cu * ones,还是应该来自你的代码?它是否可以分别调用链接器?当你有目标文件时,你不需要通过nvcc编译器驱动程序。 – Edric 2010-07-09 07:32:23