如何使用C链接制作CUDA对象文件?

时间:2012-12-21 15:06:12

标签: c++ c cuda linkage

我试图在C项目中包含一些CUDA代码。为此,我正在将CUDA源(.cu文件)编译为静态库(.lib,我正在Windows中开发)。然后,我希望将此静态库链接到我的C项目。但是,我的链接器抱怨这一步,我相信这是因为C / C ++链接问题。我得到的具体错误看起来像这样:

 Undefined symbol '_cudaMallocHost@8' referenced in "cufft object file.lib".

我正在使用CUDA 5.0,我正在使用Visual Studio 10在Windows 7计算机上编写和编译CUDA源。

首先,我有一个.cu源文件,它可以编译成静态库(“cufft object file.lib”)。我把整件事都包裹在extern C { }中。它看起来像这样:

extern "C" {

#include <cuda.h>
#include <cufft.h>

int myCUDAfunction()
{
    //Some CUDA code
}

}

与此同时,我创建了一个头文件,其中包含.cu源代码中定义的函数列表(“myCUDAheader.h”),其内容只是一系列函数原型:

int myCUDAfunction();

最后在我的C项目中,我添加了静态库并包含头文件。

在我开始使用extern "C"声明CUDA源.cu文件中的函数之前,链接器抱怨缺少这些函数的符号。它们必须现在正确地编译为C链接,但实际的CUDA函数(例如cudaMalloc)似乎仍然具有C ++链接。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

您不能更改CUDA库的链接,但您也不需要。所以这个:

extern "C" {

#include <cuda.h>
#include <cufft.h>

int myCUDAfunction();

.....

}

是错误的,因为你声明CUDA运行时库有C链接,而它可能没有。这是正确的:

#include <cuda.h>
#include <cufft.h>

extern "C" {

int myCUDAfunction();
.....

}

那样myCUDAfunction具有C链接,并且在从编译并与C工具链链接的代码调用时将链接。这样做的关键是为您的 CUDA代码及其调用的库函数提供C可调用包装函数。这样你的C代码就完全不了解CUDA代码的C ++基础。

答案 1 :(得分:2)

您是否已将CUDA标头包含在内并将cudart.lib链接到C应用程序?如果不是,您可能需要这样做,因为静态库不包含实际的CUDA库实现。另外,我认为你链接它们的顺序很重要,如果你的库是cudart.lib或者反过来,我记不清了。如果最坏的情况发生,您可能需要将C项目设置为CUDA项目。