如何用Cheaders和CUDA代码编译C代码?
How to compile C code with C headers and CUDA code?
我有一个主要代码使用了一些库,我一直在编译它:
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 文件中得到了很多 "undefined reference" 函数。
要包含我正在使用的 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 和 importedCFile.c 它工作正常。如果您使用 nvcc 编译 mainCode.cu 和 importedCFile.c,您将获得对 anExample()(importedCFile.c 中的函数)的未定义引用。
并且您评论了 header 导入 importedCFile.c 和对它会找到的 anExampled() 函数的调用。
您的问题是 importedFile.c 中的 C 代码试图回调 mainCode.cu 中的 C++ 函数。
为了可以从 C 调用,C++ 函数必须具有 C 链接。将 getVector()
声明为
extern "C" int *getVector(int n) {
in mainCode.cu,您的示例将编译正常。
我有一个主要代码使用了一些库,我一直在编译它:
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 文件中得到了很多 "undefined reference" 函数。
要包含我正在使用的 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 和 importedCFile.c 它工作正常。如果您使用 nvcc 编译 mainCode.cu 和 importedCFile.c,您将获得对 anExample()(importedCFile.c 中的函数)的未定义引用。
并且您评论了 header 导入 importedCFile.c 和对它会找到的 anExampled() 函数的调用。
您的问题是 importedFile.c 中的 C 代码试图回调 mainCode.cu 中的 C++ 函数。
为了可以从 C 调用,C++ 函数必须具有 C 链接。将 getVector()
声明为
extern "C" int *getVector(int n) {
in mainCode.cu,您的示例将编译正常。