构建 Tensorflow 调试时出现错误LNK2019

Error LNK2019 when building Tensorflow debug

本文关键字:错误 LNK2019 Tensorflow 调试 构建      更新时间:2023-10-16

我尝试在Windows中对Tensorflow 2.0的C++ API的CPU版本进行调试。我用于构建的命令是:

bazel build -c dbg --copt=/w34716 tensorflow:tensorflow.dll

但是当我构建它时,我收到此错误:

depth_space_ops.lo.lib(depthtospace_op.obj) : error LNK2019: unresolved external symbol "public: void __cdecl tensorflow::functor::DepthToSpaceOpFunctor<struct Eigen::GpuDevice,struct Eigen::half,1>::operator()(struct Eigen::GpuDevice const &,class Eigen::TensorMap<class Eigen::Tensor<struct Eigen::half const ,4,1,__int64>,16,struct Eigen::MakePointer>,int,class Eigen::TensorMap<class Eigen::Tensor<struct Eigen::half,4,1,__int64>,16,struct Eigen::MakePointer>)" (??R?$DepthToSpaceOpFunctor@UGpuDevice@Eigen@@Uhalf@2@$00@functor@tensorflow@@QEAAXAEBUGpuDevice@Eigen@@V?$TensorMap@V?$Tensor@$$CBUhalf@Eigen@@$03$00_J@Eigen@@$0BA@UMakePointer@2@@4@HV?$TensorMap@V?$Tensor@Uhalf@Eigen@@$03$00_J@Eigen@@$0BA@UMakePointer@2@@4@@Z) referenced in function "public: virtual void __cdecl tensorflow::DepthToSpaceOp<struct Eigen::ThreadPoolDevice,struct Eigen::half>::Compute(class tensorflow::OpKernelContext *)" (?Compute@?$DepthToSpaceOp@UThreadPoolDevice@Eigen@@Uhalf@2@@tensorflow@@UEAAXPEAVOpKernelContext@2@@Z)

关于这个问题,我唯一发现的是这个 GitHub 问题,它没有解决。

有谁知道如何解决这个问题?

面对同样的必要性,我在代码中挖掘了一下,实际上找到了问题的根源: 它包含在以下两个if块中:https://github.com/tensorflow/tensorflow/blob/v2.3.0/tensorflow/core/kernels/spacetodepth_op.cc#L129 和 https://github.com/tensorflow/tensorflow/blob/v2.3.0/tensorflow/core/kernels/depthtospace_op.cc#L115。

如果你在调试中构建一个非GPU版本的库,那么发生错误的原因就很清楚了:DepthToSpaceOp类的if (std::is_same<Device, GPUDevice>::value),例如,用CPUDevice参数化,将在编译时计算为if (false)。启用任何优化后,if 子句中的代码(使用模板参数 GPUDevice 显式触发DepthToSpaceOpFunctor- 正是您获得的缺失符号(根本不会被编译,因此不需要链接。

在调试版本中,它仍然可能被编译,即使很明显它永远不会被执行。然后,链接器尝试查找使用 GPU 参数化的 DepthToSpaceOpFunctor 模板的operator(),但未能这样做。

解决此问题的一种快速而肮脏的方法是注释掉上述两个文件中的整个 if 子句(如果您正在构建仅限 CPU 的 dll(。

一个更优雅的解决方案是通过模板专用化来避免这些链接器错误,方法是将对 GPU 的显式引用更改为设备,因为这些错误将出现在仅在设备为 GPU 时执行的代码中。我将很快为我在 github 上提出的类似问题添加一个拉取请求,希望在经过更多测试之后。

更新:拉取请求已提交,您可以在此处找到代码更改以修复这组特定的链接器错误:https://github.com/tensorflow/tensorflow/pull/42307/files#

对于 GPU 调试 dll - 我不确定为什么这些错误仍然存在,但无论如何在这种情况下还有其他链接错误;)