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
完结