如何使用C头和CUDA代码编译C代码?

时间:2017-03-07 19:36:28

标签: c cuda nvcc

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

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'正在使用'importMile2.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和importedCFile.c,您将获得对anExample()(importedCFile.c中的函数)的未定义引用。

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

1 个答案:

答案 0 :(得分:1)

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

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

extern "C" int *getVector(int n)  {
在mainCode.cu中

,您的示例将编译正常。