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 时,你需要关闭带有
的声明的名称修饰
1 2 3 4 5 6 7 | #ifdef __cplusplus extern"C" { #endif extern void check_error(cudaError_t status); #ifdef __cplusplus } #endif |