我有一个使用一些库的主要代码,我一直这样编译它:
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()函数的调用,它会正常工作。
您的问题是importedFile.c中的C代码正在尝试回调mainCode.cu中的C++函数。
为了能够从 C 调用,C++ 函数必须具有 C 链接。将
getVector()
声明为
extern "C" int *getVector(int n) {
在 mainCode.cu 中,您的示例将正常编译。