undefined symbol:_ZTIN10tensorflow8OpKernelE

时间:2018-01-10 14:40:11

标签: tensorflow undefined symbols

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

我有一个自定义的op库,我用-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

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

4 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:1)

我在我的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 $@ $^

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

 pip uninstall -y horovod


 pip install --no-cache-dir horovod