VS/CMake中.cu被识别为.cpp且报cuda_library::foo(int)未解析外部符号
问题排查与解决方案
1 链接错误(unresolved external symbol)修复
错误根源
核心问题出在foo函数的inline修饰符和实现位置不匹配:
- C标准要求inline函数的定义必须在所有调用它的编译单元中可见,你将
foo的实现放在了cuda_library.cu中,只有nvcc编译该CUDA文件时能看到实现;而调用foo的file_using_cuda_lib.cpp是用普通C编译器编译的,引入头文件时只能看到foo的声明,看不到实现,最终链接时无法找到对应符号。 - 额外限制:
foo内部包含CUDA特有的<<<>>>内核调用语法,普通C编译器无法识别,也不能直接把实现暴露给C编译单元。
解决方案
按如下步骤修改即可:
- 移除
foo函数的inline修饰符:- 头文件
cuda_library.h修改为:
#ifndef _CUDA_LIBRARY_H_ #define _CUDA_LIBRARY_H_ namespace cuda_library { int foo(int number); // 移除inline修饰 } #endifcuda_library.cu中的实现同步移除inline修饰:
namespace cuda_library { __global__ void real_foo(int number, int *out) { *out = number * 2; } int foo(int number) { // 移除inline修饰 int* x; cudaMallocManaged(&x, sizeof(int)); real_foo<<<1,1>>>(number, x); cudaDeviceSynchronize(); int y = *x; cudaFree(x); return y; } } - 头文件
- 补充
cuda_library的CMake配置,对齐上层库的CUDA属性:
在cuda_library对应的CMakeLists.txt中添加如下配置:set_target_properties(cuda_library PROPERTIES POSITION_INDEPENDENT_CODE ON CUDA_SEPARABLE_COMPILATION ON CUDA_ARCHITECTURES native # 自动匹配当前设备的CUDA架构,也可手动指定如"75;86" )
2 IntelliSense关键字报错修复
错误根源
Visual Studio原生IntelliSense不识别CUDA专属关键字__global__、__device__等,仅为编辑器提示问题,不影响实际编译结果。
解决方案
在cuda_library.cu文件最开头添加如下仅对IntelliSense生效的宏定义即可,不会影响实际编译逻辑:
#ifdef __INTELLISENSE__ #define __global__ #define __host__ #define __device__ #endif
如果项目中有多个CUDA文件存在同类问题,可以把这段宏封装为公共头文件,所有.cu文件引入即可。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

