生成Tensorflow调试时出现错误LNK2019 我尝试在Windows中对TysFoeLoad 2的C++ API的CPU版本进行调试。我用于构建的命令是: bazel build -c dbg --copt=/w34716 tensorflow:tensorflow.dll

生成Tensorflow调试时出现错误LNK2019 我尝试在Windows中对TysFoeLoad 2的C++ API的CPU版本进行调试。我用于构建的命令是: bazel build -c dbg --copt=/w34716 tensorflow:tensorflow.dll,c++,windows,tensorflow,linker,C++,Windows,Tensorflow,Linker,但是当我构建这个时,我得到了一个错误: 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:

但是当我构建这个时,我得到了一个错误:

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)
depth\u space\u ops.lo.lib(depthtospace\u op.obj):错误LNK2019:未解析的外部符号“public:void\uu cdecl tensorflow::functor::DepthToSpaceOpFunctor::operator()(结构特征::GpuDevice const&,类特征::TensorMap,int,类特征::TensorMap)”(??R$DepthToSpaceOpFunctor@UGpuDevice@本征@@Uhalf@2@$00@functor@张量流@@QEAAXAEBUGpuDevice@Eigen@@V$TensorMap@V张量@$$CBUhalf@Eigen@@$03$00_J@Eigen@@$0BA@UMakePointer@2@@4@HV?$TensorMap@V?$Tensor@Uhalf@特征@@03$00_J@Eigen@@$0BA@UMakePointer@函数中引用了2@@4@@Z)“public:virtualvoid\uu cdecl tensorflow::DepthToSpaceOp::Compute(类tensorflow::OpKernelContext*)”(?Compute@$DepthToSpaceOp@UThreadPoolDevice@本征@@Uhalf@2@@张量流@@UEAAXPEAVOpKernelContext@2@@Z)
关于这个问题,我发现的唯一一件事就是GitHub问题,它没有得到解决


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

面对同样的必要性,我仔细研究了代码,实际上找到了问题的根源:它包含在以下两个
if
块中:和

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

在调试版本中,它仍然可能被编译,即使很明显它永远不会被执行。然后链接器尝试为使用GPUDevice参数化的DepthToSpaceOpFunctor模板找到
操作符()
,但未能找到

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

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

更新:提交拉取请求后,您可以在此处找到修复这组特定链接器错误的代码更改:

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

您是否尝试过使用