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

问题描述 投票:0回答:1

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

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 代码所需的标志,例如

-lrt
O3
lm
Wall
??

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

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

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

并且您评论了导入importedCFile.c的标头以及对anExampled()函数的调用,它会正常工作。

c cuda nvcc
1个回答
2
投票

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

为了能够从 C 调用,C++ 函数必须具有 C 链接。将

getVector()
声明为

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

在 mainCode.cu 中,您的示例将正常编译。

© www.soinside.com 2019 - 2024. All rights reserved.