VS2019下TensorFlow2.6 C++调用TensorInfo的name()报动态库入口点错误
问题根因
该报错属于Windows平台动态链接时的符号缺失问题,你怀疑的tensorflow_cc.dll编译问题确实是最常见的诱因。TensorInfo是TensorFlow从Proto定义自动生成的C++类,它的name() getter方法默认不会被标记为DLL导出项,绝大多数官方预编译或者自行编译的tensorflow_cc.dll都会漏导出这个符号,就会出现调用该接口时触发入口点找不到的错误,其余未用到缺失符号的API调用都可以正常运行。
修复方案
- 方案一:重新编译完整导出符号的
tensorflow_cc.dll
编译TensorFlow源码时,在配置阶段添加编译参数:
该参数会强制让Proto生成类的所有成员函数符号都导出到动态库中,覆盖默认的导出规则。--define=override_eigen_strong_inline=true --copt=-DTENSORFLOW_USE_DLL --copt=-DPROTOBUF_USE_DLLS - 方案二:绕过
TensorInfo::name()调用
不需要修改TensorFlow库,直接调整业务代码即可:在导出SavedModel的Python代码里提前打印好serving_default签名的所有输入、输出张量名,硬编码到C++推理代码中,或者将张量名清单存到独立的配置文件中加载,完全不需要运行时调用TensorInfo::name()接口获取。 - 方案三:静态链接TensorFlow C++库
编译时选择使用静态版本的tensorflow_cc.lib,直接把所有TensorFlow相关的符号打包到最终的exe文件中,完全规避动态链接的符号缺失问题,缺点是生成的可执行文件体积会增加数百MB。
内容的提问来源于stack exchange,提问作者Fedor Petrov
相关产品推荐
相关产品推荐

