9

gcc and CUDA question

Hi,

I have compiled a CUDA shared library but can't link it with the main program that uses it. I am compiling the main program with gcc.

The code:

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>>>();
    }

I compile test.cu as --> It works

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

I compile simplemain.c as ---> It gives error :(

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

2 Answers2

3

C and C++ name the functions in different way.

Since nvcc treat the CPU code in .cu file as C++, you could rename your simplemain.c to simplemain.cpp, and compile it with g++

Another solution could be adding extern "C" before the function definition in the .cu file.

kangshiyin
  • 9,681
  • 1
  • 17
  • 29
3

try using g++ instead of gcc. nvcc uses c++ style linking conventions. (You don't need to rename any files.)

alternatively, if you must use gcc, preface your void fcudadriver() function definition like this:

extern "C" void fcudadriver()
Robert Crovella
  • 143,785
  • 11
  • 213
  • 257