【问题标题】:undefined symbol: _ZTIN10tensorflow8OpKernelE未定义符号:_ZTIN10tensorflow8OpKernelE
【发布时间】:2018-06-19 18:21:20
【问题描述】:

我刚刚用 pip3 更新了 tensorflow(现在到版本 1.4.1)。之后我遇到了问题:

我有一个使用 -D _GLIBCXX_USE_CXX11_ABI=0 编译的自定义操作库。该库可以正常编译和链接。将其导入 tensorflow 给出:

Traceback (most recent call last):
  ...
  File "../x.py", line 29, in <module>
    lib = tf.load_op_library(_lib_path)
  File "/home/ilge/.local/lib/python3.5/site-packages/tensorflow/python/framework/load_library.py", line 56, in load_op_library
    lib_handle = py_tf.TF_LoadLibrary(library_filename, status)
  File "/home/ilge/.local/lib/python3.5/site-packages/tensorflow/python/framework/errors_impl.py", line 473, in __exit__
    c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.NotFoundError: /path/to/mylib.so: undefined symbol: _ZTIN10tensorflow8OpKernelE

它似乎无法加载一般的张量流符号。非常感谢我如何调试它的提示。请注意,在更新之前和重新编译之前一切正常。

【问题讨论】:

    标签: tensorflow undefined symbols


    【解决方案1】:

    查看更新的自定义操作说明:https://www.tensorflow.org/extend/adding_an_op#compile_the_op_using_your_system_compiler_tensorflow_binary_installation

    特别是:

    >>> tf.sysconfig.get_link_flags()
    ['-L/usr/local/lib/python3.6/dist-packages/tensorflow', '-ltensorflow_framework']
    

    现在(在 TensorFlow 1.4+ 中)通过链接 libtensorflow_framework.so 注册自定义操作。之前 TensorFlow 将必要的符号加载到 Python 进程的全局符号表中(使用 RTLD_GLOBAL)。

    【讨论】:

      【解决方案2】:

      我在我的 make 文件中的两个不同步骤中编译和链接,并且在链接还不够时仅使用正确的链接标志。我还必须将参数 -Wl,--no-as-needed 传递给链接器,因为出于某种原因 gcc 正在丢弃最终模块中的库(如 ldd 所示)。

      所以我的 Makefile 看起来像这样

      TF_CFLAGS:=$(shell python -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_compile_flags()))')
      TF_LFLAGS:=$(shell python -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_link_flags()))')
      
      all: myop_ops.so
      
      %.o: %.cc
          g++ -fPIC $(TF_CFLAGS) -O2 -std=c++11 -I/usr/local/include -c $< -o $@
      
      myop_ops.so: myfile1.o myfile2.o myop_kernel.o myop_ops.o
          g++ -shared -Wl,--no-as-needed $(TF_LFLAGS) -o $@ $^
      

      【讨论】:

        【解决方案3】:
         pip uninstall -y horovod
        
        
         pip install --no-cache-dir horovod
        

        【讨论】:

        • 请添加一些说明你想用这个代码块做什么。
        【解决方案4】:

        tensorflow 和 gcc 版本之间可能存在兼容性问题。检查 tensorflow 用于构建的 gcc 版本,并使用该版本的 gcc 来编译您的自定义操作库。 例如 我用 Anaconda2 安装了 tensorflow 1.6.0,它使用 gcc 7.2 版。因此,当我使用 gcc 4.8/4.9/5.3 编译自定义操作时,我一直遇到与您相同的错误。最后,我尝试了 gcc 7.3,它成功了。

        【讨论】:

          猜你喜欢
          • 2020-03-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-02
          • 2012-11-07
          • 2012-09-05
          • 2017-06-25
          • 2021-03-31
          • 2016-06-23
          相关资源
          最近更新 更多