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

3

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

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代码标志,例如-rt、O3、lm和Wall?
编辑:您可以在此处找到问题的缩小示例:

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

如果您使用gcc编译mainCode.c和importedCFile.c,它可以正常工作。如果您使用nvcc编译mainCode.cu和importedCFile.c,则会出现对anExample()(importedCFile.c中的函数)的未定义引用。

如果您注释掉导入importedCFile.c的头文件和调用anExampled()函数,它将正常工作。


将头文件包含语句放在 extern "C" {#include ... } 内部。否则,函数名称将按照 C++ 规则进行混淆。 - tera
@tera 我试过了,但是´importedCFile1.c´也使用了´importedCFile2.c´和´mainCode.cu´中的一些函数和变量,我得到了对这些函数和变量的“未定义引用”。 在´importedCFile1.c´中我有如下代码:extern int *getVector(int n); // 这是´mainCode.cu´中的一个函数 extern int iRand(int high); // 这是´importedCFile2.c´中的一个函数 - user3117891
2
那应该可以正常工作。请展示一些代码来演示问题。 - tera
1
你可以通过在选项前加上“-Xcompiler”将任何选项传递给C编译器(例如“-Wall”),并通过在选项前加上“-Xlinker”将任何选项传递给链接器。 “-l”和“-O”也可以直接被nvcc理解,其中“-O3”甚至是默认值。因此,您的命令行应该变成“nvcc -lrt -lm -Xcompiler -Wall importedCFile1.c importedCFile2.c mainCode.cu -o maincode”。 - tera
3
你的例子(感谢您展示)应该仍然可以正常工作。请发布一个最小化、完整化和可验证的示例 - tera
1个回答

2
您的问题是importedFile.c中的C代码试图调用mainCode.cu中的C++函数。 为了能够从C中调用,C++函数必须具有C链接。将getVector()声明为
extern "C" int *getVector(int n)  {

在mainCode.cu中,你的示例将能够顺利编译。

成功了!我非常感激,谢谢你的帮助! - user3117891

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接