gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:32:05 27 4
gpt4 key购买 nike

我正在尝试在 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”)中定义的函数列表,其内容只是一系列函数原型(prototype):

int myCUDAfunction();

等等

最后,在我的 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++ 基础。

关于c++ - 如何使用 C 链接制作 CUDA 目标文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13992446/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com