关于 c :cuda 文件没有与 C 文件中定义的函数链接

cuda file did not link with function defined in C file

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

cuda.h 包含 test.cu.

中使用的以下函数定义

1
extern void check_error(cudaError_t status);

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void check_error(cudaError_t status)
{
    cudaError_t status2 = cudaGetLastError();
    if (status != cudaSuccess)
    {  
        const char *s = cudaGetErrorString(status);
        char buffer[256];
        printf("CUDA Error: %s\
"
, 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: %s\
"
, s);
        assert(0);
        snprintf(buffer, 256,"CUDA Error Prev: %s", s);
        error(buffer);
    }
}

我使用 Visual Studio 2015 进行编译。 cuda.c 被编译为 C 文件。

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

test.cu.obj : error LNK2001: unresolved external symbol "void __cdecl check_error(enum cudaError)" (?check_error@@YAXW4cudaError@@@Z)

如何解决这个错误?

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


在编译 C 时,没有名称修饰。

当你编译 C 时,你需要关闭带有 extern"C":

的声明的名称修饰

1
2
3
4
5
6
7
#ifdef __cplusplus
extern"C" {
#endif
    extern void check_error(cudaError_t status);
#ifdef __cplusplus
}
#endif