PAconv环境配置:build.ninja缺少lib的解决+error LNK2019: 无法解析的外部符号

1.背景

最近跑PAconv项目,电脑上有版本匹配的cl.exe,但是仍然报错

Error checking compiler version for cl: [WinError 2] 系统找 不到指定的文件。

然后后面有一串cpp_extension.py里面代码的报错
没办法,只能一步步定位存在的其他错误。

2.错误定位过程

1) 首先去对应需要编译的 .cu 文件夹下,找到是否成功编译了 build.ninja 文件,我的情况是 build.ninja 文件还是成功编译了的,如果 build.ninja 文件都没有成功编译的,这里的方法应该不大适用,可以尝试在 cpp.extension.py 里面打断点,debug看哪里出了问题。

关于ninja: Ninja是用于编译的工具,相对于Makefile更注重于编译速度,Ninja默认的编译文件则是 build.ninja

(关于ninja -v)

2)build.ninja文件已经有,在terminal下用ninja -v命令,启动build.ninja文件中写入的编译命令,可以编译过程中更细的报错。我的报错有缺少多个 .lib文件(多次运行,多次报错,每次报一个),可以在build.ninja中写入这些文件,然后把这些lib在 VS2017\VC\Tools\MSVC\14.16.27023\lib\x64 和windows SDK还有windows kit中找到,然后把这些lib放到.cu所在文件夹下
(我的情况属于东拼西凑凑出来的这几个lib,这里用到的lib已经打包上传到我的CSDN资源文件中,取需)

build gpconv_cuda.pyd: link operator.o assign_score_withk_gpu.cuda.o assign_score_withk_halfkernel_gpu.cuda.o msvcprt.lib msvcrt.lib oldnames.lib kernel32.lib ucrt.lib

3)但是上面的第 2)步存在一个问题,即每次运行程序或者debug程序都会生成一个新的build.ninja文件,所以直接在build.ninja里面修改link 后要用到的库是很麻烦的,最直接的方法就是修改build.ninja的生成部分,即D:\Anaconda_app\envs\python37\lib\site-packages\torch\utils\cpp_extension.py

4)在cpp_extension.py中找到 def _write_ninja_file 函数,然后找到

link = [f'build {library_target}: link {" ".join(objects)}']

在这个语句的上面加上一句,如下:

        objects.append('msvcprt.lib msvcrt.lib oldnames.lib kernel32.lib ucrt.lib')
        link = [f'build {library_target}: link {" ".join(objects)}']

根据不同torch版本的差异,link语句可能长的有所区别,目的就是把缺的 msvcprt.lib msvcrt.lib oldnames.lib kernel32.lib ucrt.lib 每次生成build.ninja的时候都能自动写上
(不过也要注意,下次做其他项目用到cpp_extension.py时记得删除)

3.另外遇到的错误

assign_score_withk_gpu.cuda.o : error LNK2019: 无法解析的外部符号 "public: long * __cdecl at::Tensor::data_ptr<long>(void)const " (??$data_ptr@J@Tensor@at@
@QEBAPEAJXZ),该符号在函数 "void __cdecl assign_score_withk_forward_kernel_wrapper(int,int,int,int,int,int,class at::Tensor const &,class at::Tensor const
&,class at::Tensor const &,class at::Tensor const &,class at::Tensor &)" (?assign_score_withk_forward_kernel_wrapper@@YAXHHHHHHAEBVTensor@at@@000AEAV12@@Z)
 中被引用
assign_score_withk_halfkernel_gpu.cuda.o : error LNK2001: 无法解析的外部符号 "public: long * __cdecl at::Tensor::data_ptr<long>(void)const " (??$data_ptr@J
@Tensor@at@@QEBAPEAJXZ)
gpconv_cuda.pyd : fatal error LNK1120: 1 个无法解析的外部命令
ninja: build stopped: subcommand failed.

问题出在.cu文件中

解决方法:把assign_score_withk_gpu.cu和assign_score_withk_halfkernel_gpu.cu
中出现过的如下语句全部改掉

    /* const long* knn_idx_data = knn_idx.data_ptr<long>();*/
    const long* knn_idx_data = static_cast<long*>(knn_idx.data_ptr());

注释掉的语句为原来的语句,下面的语句为更改后的语句

参考:windows10+VS2017+CUDA10.1编译指南mmdet

完结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值