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

pha*_*sel 1 c c++ cuda linkage

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

 Undefined symbol '_cudaMallocHost@8' referenced in "cufft object file.lib".
Run Code Online (Sandbox Code Playgroud)

我正在使用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
}

}
Run Code Online (Sandbox Code Playgroud)

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

int myCUDAfunction();
Run Code Online (Sandbox Code Playgroud)

等等

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

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

tal*_*ies 6

您无法更改CUDA库的链接,但您也不需要.所以这:

extern "C" {

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

int myCUDAfunction();

.....

}
Run Code Online (Sandbox Code Playgroud)

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

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

extern "C" {

int myCUDAfunction();
.....

}
Run Code Online (Sandbox Code Playgroud)

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