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++链接.我该如何解决这个问题?
您无法更改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++基础.
| 归档时间: |
|
| 查看次数: |
1089 次 |
| 最近记录: |