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

1.背景

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

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

然后后面有一串cpp_extension.py里面代码的报错
除了一步一步地定位其他错误之外,别无选择。

[En]

There is no way but to locate other errors step by step.

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)}']

在这句话的开头增加一句话,如下:

[En]

Add a sentence to the top of this sentence, as follows:

        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(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(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
更改中出现的以下所有语句

[En]

Change all the following statements that have appeared in


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

被注释掉的语句是原始语句,下面的语句是更改后的语句。

[En]

The commented out statement is the original statement, and the following statement is the changed statement.

Original: https://blog.csdn.net/goodgoodstudy___/article/details/121996706
Author: study_&
Title: PAconv环境配置:build.ninja缺少lib的解决+error LNK2019: 无法解析的外部符号

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/511740/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球