【问题标题】:How to compile C code with C headers and CUDA code?如何使用 C 头文件和 CUDA 代码编译 C 代码?
【发布时间】:2017-07-28 03:58:17
【问题描述】:

我有一个使用一些库的主代码,我一直在编译它:

gcc importedCFile1.c importedCFile2.c mainCode.c -O3 -lm -Wall -o maincode -lrt

现在我在 mainCode 中添加了 CUDA 代码并将其扩展名更改为 .cu... 那么,我该如何编译整个代码呢?

我试过了:

nvcc importedCFile1.c importedCFile2.c mainCode.cu -o maincode 

但我在导入的 C 文件中对我的函数有很多“未定义的引用”。

要包含我正在使用的 C 文件:

extern "C" {
   #include "importedCFile1.h"
   #include "importedCFile2.h"
}

而“importedCFile1.c”正在使用“importedCFile2.c”和“mainCode.cu”中声明的一些函数和变量。像这样:

extern int **se;        // Variables from mainCode  
extern int *n;          
extern int numNodes;

extern int *getVector(int n);   // Function from mainCode
extern int iRand(int high);     // Function from importedCFile2

这个函数是未定义引用的原因。我该怎么办?

另外,如何添加 C 代码所需的标志,例如 -lrtO3lmWall??

编辑:您可以在此处找到问题的简化示例:

https://github.com/mvnarvaezt/cuda/tree/master/minimalExample

如果你用 gcc 编译 mainCode.c 和importedCFile.c 它工作正常。如果您使用 nvcc 编译 mainCode.cu 和 importsCFile.c,您将获得对 anExample()(importedCFile.c 中的函数)的未定义引用。

然后您评论导入importedCFile.c 的标头以及它可以找到的对anExampled() 函数的调用。

【问题讨论】:

  • 将头文件包含在extern "C" {#include ... } 中。否则函数名将根据 C++ 规则被破坏。
  • @tera 我做了,但是“importedCFile1.c”也使用了“importedCFile2.c”和“mainCode.cu”中的一些函数和变量,我得到了“未定义的引用”。我在“importedCFile1.c”中有类似的东西:extern int *getVector(int n); // 这是mainCode.cu中的一个函数 extern int iRand(int high); // 这是importedCFile2.c中的一个函数
  • 应该可以正常工作。向我们展示一些代码来演示问题。
  • 您可以通过在前面加上-Xcompiler 将任何选项传递给C 编译器(如-Wall),并在前面加上-Xlinker 将任何选项传递给链接器。 -l-Oare 也被 nvcc 直接理解,其中 -O3 even 是默认值。所以你的命令行应该变成nvcc -lrt -lm -Xcompiler -Wall importedCFile1.c importedCFile2.c mainCode.cu -o maincode
  • 您的示例(感谢您的展示)应该仍然可以正常工作。请发帖Minimal, Complete, and Verifiable example

标签: c cuda nvcc


【解决方案1】:

您的问题是importedFile.c 中的C 代码试图回调mainCode.cu 中的C++ 函数。

为了能够从 C 中调用,C++ 函数必须具有 C 链接。将getVector() 声明为

extern "C" int *getVector(int n)  {

在 mainCode.cu 中,您的示例将编译得很好。

【讨论】:

  • 成功了!非常感谢,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2014-05-19
  • 2020-09-20
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2019-07-31
相关资源
最近更新 更多