cuda文件并没有链接到C文件中定义的函数

cuda file did not link with function defined in C file

本文关键字:文件 定义 函数 并没有 链接 cuda      更新时间:2023-10-16

我有一个cuda文件test.cu,其中包括一个文件cuda.h。

cuda.h包含test.cu.中使用的以下函数定义

extern void check_error(cudaError_t status);

这个函数在cuda.c中定义如下:

void check_error(cudaError_t status)
{
cudaError_t status2 = cudaGetLastError();
if (status != cudaSuccess)
{   
const char *s = cudaGetErrorString(status);
char buffer[256];
printf("CUDA Error: %sn", s);
assert(0);
snprintf(buffer, 256, "CUDA Error: %s", s);
error(buffer);
} 
if (status2 != cudaSuccess)
{   
const char *s = cudaGetErrorString(status);
char buffer[256];
printf("CUDA Error Prev: %sn", s);
assert(0);
snprintf(buffer, 256, "CUDA Error Prev: %s", s);
error(buffer);
} 
}

我使用Visual studio 2015进行编译。cuda.c被编译为一个c文件。

没有编译错误。但我得到以下链接错误:

test.cu.obj:error LNK2001:未解析的外部符号"void __cdecl check_error(enum-cudaError)"(?check_error@@YAXW4cudaError@@@Z)

如何解决此错误?

这不是CUDA和C++中名称篡改的重复,因为它询问的是相反的顺序。从Cuda代码中调用C函数。在上面的问题中,它用于从C文件中调用cuda函数。

编译C时没有名称篡改。

编译C++时,需要使用extern "C":关闭声明的名称篡改

#ifdef __cplusplus
extern "C" {
#endif
extern void check_error(cudaError_t status);
#ifdef __cplusplus
}
#endif