You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:37:07