构建 Tensorflow 调试时出现错误LNK2019
Error LNK2019 when building Tensorflow debug
我尝试在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 - 我不确定为什么这些错误仍然存在,但无论如何在这种情况下还有其他链接错误;)
- Visual Studio中的wxwidgets应用程序给出错误"LNK2019 unresolved external symbol"
- 构建 Tensorflow 调试时出现错误LNK2019
- 错误LNK2019未解析的外部符号"public: __thiscall SLinkList<char>::SLinkList<char>(void)"
- Google Test:错误 LNK2019:使用 Visual Studio 2017 与 CMake 进行未解析的外
- Azure IOT 错误LNK2019:函数IoTHubClient_LL_UploadToBlob_step1and2
- C++编译错误LNK2019:未解决的外部符号错误
- 错误 LNK2019: 未解析的外部符号 Visual Studio 2013 与 openCV
- 调用静态方法,收到错误:LNK2019
- nanodbc 错误 LNK2019:未解析的外部符号 - 在基本连接上
- 编译轨道样品时的C 错误-LNK2019未解决的外部符号
- main.obj : 错误 LNK2019: 未解析的外部符号 公共: __cdecl.
- 如何在我的指针和阵列功能中修复未解决的外部错误-LNK2019和LNK1120
- 错误LNK2019:未解决的外部符号模板
- 错误LNK2019:未解决的外部符号-MSVC调试构建功能模板
- 错误 LNK2019:未解析的外部符号"double __cdecl calculateRetail(double,double)"
- 错误 LNK2019:未解析的外部符号"外部"C"此错误是什么?
- 字符串以使用SQLAPI(Visual Studio 2010)时出现错误LNK2019
- 使用继承的编译器错误lnk2019和c4930
- 错误 LNK2019:GPLVM 代码中未解析的外部符号 _lbfgs_
- openCV 243 使用静态库错误LNK2019