无法解决将一个库(基于 C++)链接到另一个库(基于 CUDA)时LNK2019和LNK2021错误 [已关闭]

Unable to solve LNK2019 and LNK2021 error when linking one lib (C++ based) with another (CUDA based) [closed]

提问人:Harshvardhan Chandirasekar 提问时间:1/25/2021 最后编辑:AbdelAziz AbdelLatefHarshvardhan Chandirasekar 更新时间:1/26/2021 访问量:185

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

2年前关闭。

我正在尝试将库从 Linux 移植到 Windows,该库由两个库组成,一个是完全基于 CUDA 的库,单独构建,另一个基于 C++ 并链接到基于 CUDA 的库。

该库使用了 MSVC 不允许的动态数组,所以我将它们转换为向量并在 Linux 上成功测试了它们,但在 Windows 上我遇到了一堆 Windows 链接器问题,例如 和 ,主要是当 C++ 库中的函数引用基于 CUDA 的库中的函数时,例如:LNK2019LNK2001

错误 LNK2019:未解析的外部符号“void __cdecl 激活MishForward(float *,float *,int,struct CUstream_st *)” (?activationMishForward@@YAXPEAM0HPEAUCUstream_st@@@Z) 引用于 函数 “public: virtual int __cdecl dnn::ActivationMishRT::enqueue(int,void const * const *,void * *,void *,struct CUstream_st *)“ (?enqueue@ActivationMishRT@dnn@tk@@UEAAHHPEBQEBXPEAPEAXPEAXPEAUCUstream_st@@@Z)

即使我没有链接到基于 CUDA 的库,此错误似乎也不会改变,似乎由于某种原因,即使我链接到库,它也无法解析符号。

有人可以解释这里发生了什么以及我应该如何修复链接错误吗?

C Windows 视觉 C++ CUDA 链接器错误

评论

2赞 Igor Tandetnik 1/25/2021
您可以在 CUDA 库上运行,看看它实际导出了哪些名称。如果我不得不猜测,我会怀疑该函数是以一个普通的未修饰名称导出的,您需要从 C++ 链接到它。DUMPBIN /SYMBOLSextern "C"
0赞 Harshvardhan Chandirasekar 1/26/2021
我确实尝试使用extern“C”,但仍然不起作用。也许我以错误的方式使用它,您能否举例说明如何正确使用它?

答:

1赞 AbdelAziz AbdelLatef 1/26/2021 #1

这意味着您尝试使用的此函数在库中找不到,即使其一种类型的参数与库中的参数不匹配,结果也将是相同的。
确保您使用的函数与库中定义的函数完全相同。
activationMishForward(float *,float *,int,struct CUstream_st *)