构建Tensorflow调试时出现错误LNK2019

时间:2020-06-02 10:08:42

标签: c++ windows tensorflow linker

我尝试在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)

我发现的唯一与此问题有关的是this GitHub问题,该问题尚未解决。

有人知道如何解决此问题吗?

1 个答案:

答案 0 :(得分:0)

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

如果您要在调试中构建该库的非GPU版本,则很清楚为什么会发生错误:if (std::is_same<Device, GPUDevice>::value)类的DepthToSpaceOp,例如,用CPUDevice参数化的参数,在编译期间将评估为if (false)。启用任何优化后,if子句中的代码(使用模板参数GPUDevice显式触发DepthToSpaceOpFunctor-正是您正在获取的丢失符号)根本不会编译,因此不需要链接。

在调试版本中,即使很明显它将永远不会执行,仍然可能会对其进行编译。然后,链接器尝试为使用GPUDevice参数化的DepthToSpaceOpFunctor模板查找operator(),但未能成功。

解决此问题的一种快捷方法是在两个文件中注释整个if子句(如果您正在构建仅CPU的dll) 上面提到过。

一种更优雅的解决方案是通过将对GPUDevice的显式引用更改为Device来通过模板专门化来避免这些链接器错误,因为这些错误仅在Device 被执行时才在代码中执行 GPUDevice。不久之后,我将在我在github上提出的类似issue上添加一个拉取请求,希望经过更多测试。

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

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