CUDA使用Lambda编译时出现unresolved external symbol错误的解决方法
CUDA编译LNK2019错误解决(Windows+VS2022+nvcc12.4)
问题描述
使用nvcc v12.4.99(Windows环境,VS 17 2022)编译CUDA代码,编译参数为-arch=sm_75 -rdc=true --expt-extended-lambda,出现LNK2019未解析外部符号错误:
LINK : error LNK2019: unresolved external symbol __cudaRegisterLinkedBinary_81293256_4_t_cu_2bebb7d5_7784 referenced in function "void __cdecl __nv_cudaEntityRegisterCallback(void * *)" (?__nv_cudaEntityRegisterCallback@@YAXPEAPEAX@Z)
编译代码如下:
template <typename F, typename... Args> __device__ void exec(F f, uint32_t tid, Args &&...args) { f(tid, static_cast<Args &&>(args)...); } template <typename F, typename... Args> __global__ void kernel(F f, Args... args) { uint32_t tid = blockIdx.x * blockDim.x + threadIdx.x; exec(f, tid, args...); } template <uint32_t X, uint32_t Y, typename F, typename... Args> void launch(F f, Args &&...args) { kernel<F><<<X, Y>>>(f, static_cast<Args &&>(args)...); } int main() { launch<4, 4>([] __device__(uint32_t id, uint32_t v) { printf("%u %u\n", id, v); }, 1u); return 0; }
猜测错误由-rdc=true参数导致,寻求解决方法。
解决方法
- 添加静态CUDA运行时库链接:启用
-rdc=true(可重定位设备代码)后,需显式链接cudart_static.lib。在VS项目设置中,进入「链接器→输入→附加依赖项」添加该库;或手动编译时在命令后追加-lcudart_static。 - 替换
-rdc=true为-dc:若不需要完整的设备代码链接功能,将-rdc=true替换为-dc(仅编译为可重定位设备代码,不触发额外链接步骤),同样支持模板和设备端lambda,且不会引发此类链接错误。 - 补充CUDA库路径:手动执行nvcc命令时,需确保纳入CUDA库路径,例如添加
-L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\lib\x64"(路径根据实际安装目录调整),配合静态库完成链接。
内容的提问来源于stack exchange,提问作者dmgjk
相关产品推荐
相关产品推荐

