将CUDA静态或共享库与gcc链接的未定义引用错误

时间:2013-01-20 05:16:01

标签: c cuda shared-libraries undefined-reference nvcc

gcc和CUDA问题

您好,

我编译了一个CUDA共享库,但无法将其与使用它的主程序链接。我正在用gcc编译主程序。

代码:

simplemain.c

    #include <stdio.h>
    #include <stdlib.h>



    void fcudadriver();

    int main()
    {
      printf("Main \n");
      fcudadriver();
      return 0;
    }

test.cu

    __global__ void fcuda()
    {
    }

    void fcudadriver()
    {
      fcuda<<<1,1>>>();
    }

我将test.cu编译为 - &gt;它的工作原理

    nvcc --compiler-options '-fPIC' -o libtest.so --shared test.cu

我将simplemain.c编译为---&gt;它给出了错误:(

    gcc simplemain.c -L. -ltest
    /tmp/ccHnB4Vh.o:simplemain.c:function main: error: undefined reference to 'fcudadriver'
    collect2: ld returned 1 exit status

2 个答案:

答案 0 :(得分:2)

C和C ++以不同的方式命名函数。

由于nvcc将.cu文件中的CPU代码视为C ++,您可以将simplemain.c重命名为simplemain.cpp,并使用g++

进行编译

另一种解决方案可能是在.cu文件中的函数定义之前添加extern "C"

答案 1 :(得分:2)

尝试使用g ++而不是gcc。 nvcc使用c ++样式链接约定。 (您无需重命名任何文件。)

或者,如果您必须使用gcc,请在void fcudadriver()函数定义前加上:

extern "C" void fcudadriver()