【问题标题】:undefined reference error for linking CUDA static or shared library with gcc将 CUDA 静态或共享库与 gcc 链接的未定义引用错误
【发布时间】:2013-01-03 12:28:08
【问题描述】:

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 编译为 --> 它可以工作

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

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

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

【问题讨论】:

  • +1 包含一个完整的、可编译的、简单的示例
  • Bibrak:如果@RobertCrovella 回答了您的问题,请将其标记为已接受。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    extern "C" void fcudadriver()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 2018-12-27
      • 2021-05-14
      • 2013-10-09
      相关资源
      最近更新 更多