繁体   English   中英

如何使用C链接制作CUDA目标文件?

[英]How to make CUDA object file with C 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对象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"符号extern "C"声明CUDA源.cu文件中的功能之前,链接程序抱怨缺少这些功能的符号。 现在必须正确地将它们编译为C链接,但是实际的CUDA函数(例如cudaMalloc )似乎仍然具有C ++链接。 我该如何解决?

您无法更改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 ++基础。

您是否已包含CUDA标头并将cudart.lib链接到C应用程序? 否则,您可能需要这样做,因为您的静态库将不包括实际的CUDA库实现。 另外,我认为将它们链接的顺序很重要,如果是您的库,然后是cudart.lib或相反,我就不会想起。 如果最坏的情况发生,您可能必须将C项目设置为CUDA项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM