语法网库中未定义的符号

时间:2018-07-25 10:18:23

标签: tensorflow syntaxnet

我正在使用gcc 4.8和bazel 0.11.1(python 2.7.15)在Ubuntu 16.04上从源(主分支)构建dragnn / syntaxnet,仅CPU,没有特殊优化。按照自述文件中的说明,构建和所有测试一样成功,并且tensorflow,syntaxnet和dragnn python软件包都已正确安装。
但是,当我尝试使用syntaxnet或dragnn时,在导入某些库时遇到“未定义符号”。例如,此导入:

from dragnn.python import graph_builder  

将产生:

tensorflow.python.framework.errors_impl.NotFoundError: dragnn_cc_impl.so: undefined symbol: _ZN10tensorflow10DEVICE  

实际上,此符号_ZN10tensorflow10DEVICE在所有.so文件中均未定义。我深入研究了代码并检查了构建设置,并了解到这是在const char[]中定义并从types.cc导出的libtensorflow_framework.so。所以...

  1. dragnn_cc_impl.so(和其他.so文件,如parser_ops.so)上运行ldd表示不依赖此动态库。当然,假设仍然加载了库,那么这本身并不一定是问题。这是设计使然吗?
  2. 假设仍然加载了库,为什么在运行时找不到符号?
  3. 在检查预编译的二进制文件时,我注意到实际上是将相同的符号静态链接到使用它们的库中(例如parser_ops.so)-是在旧版本中那样,后来又更改了,或者也许是错误的
  4. 在构建说明中(我已经按照它们进行操作了……)
  5. 如果我在相同的环境中构建自己的自定义ops库,则它既可以构建又可以正常工作(相同的符号在库中也显示为未定义,但在运行时可以找到)

任何见解将不胜感激!

新信息:
似乎问题出在构建pip软件包的脚本中-它们创建了libtensorflow_framework.so-当直接从已构建的二进制文件运行时(如jupyter笔记本所做的那样),在_pywrap_tensorflow_internal.so中找到了符号,而软件包生成器创建了libtensorflow_framework .so而是将其导出。

0 个答案:

没有答案