2017-03-07 171 views
1

我有一个主代码至极使用了一些图书馆,我开始编制这样的:如何用C头文件和CUDA代码编译C代码?

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代码的标志,如-lrtO3lmWall

编辑:您可以在这里找到问题的降低例如:

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

如果编译mainCode.c和importedCFile.c用gcc正常工作。如果你用nvcc编译mainCode.cu和importedCFile.c,你会得到一个未定义的对anExample()(在importedCFile.c中的函数)的引用。

然后您将注释导入importedCFile.c的头文件和对anExampled()函数的调用查找。

+0

将头文件包含在'extern“C”{#include ...}'内。否则,函数名称将会根据C++规则而变形。 – tera

+0

@tera我做了,但'importedCFile1.c'也使用了'importedCFile2.c'和'mainCode.cu'中的一些函数和变量,我得到了那些“未定义的引用”。 我有'inimportedCFile1.c'这样的东西: extern int * getVector(int n); //这是mainCode.cu中的一个函数 extern int iRand(int high); //这是importedCFile2.c中的一个函数 – user3117891

+2

这应该可以正常工作。向我们展示一些代码来展示问题。 – tera

回答

1

你的问题是,importedFile.c中的C代码试图调用mainCode.cu中的C++函数。

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

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

在mainCode.cu,和你的榜样将编译好的。

+0

它的工作!我很感激,谢谢你的帮助! – user3117891