1

我正在尝试在 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();

ETC

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

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

4

2 回答 2

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++ 基础。

于 2012-12-21T16:11:24.287 回答
2

您是否包含了 CUDA 头文件并将 cudart.lib 链接到您的 C 应用程序?如果不是,您可能需要这样做,因为您的静态库将不包含实际的 CUDA 库实现。另外,我认为链接它们的顺序很重要,如果是您的库然后是 cudart.lib 或其他方式,我不记得我的头。如果最坏的情况发生在最坏的情况下,您可能必须将您的 C 项目设置为 CUDA 项目。

于 2012-12-21T15:28:13.350 回答