未定义符号:_ZTIN10tensorflow8OpKernelE

Posted

技术标签:

【中文标题】未定义符号:_ZTIN10tensorflow8OpKernelE【英文标题】:undefined symbol: _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

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

【问题讨论】:

【参考方案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,它成功了。

【讨论】:

以上是关于未定义符号:_ZTIN10tensorflow8OpKernelE的主要内容,如果未能解决你的问题,请参考以下文章

未定义符号 体系结构 x86_64 的未定义符号:“_kCFAllocatorDefault”

Qt 5.2 Mac 10.10.1 架构 x86_64 的未定义符号

架构 x86_64 的未定义符号:El Capitan [重复]

MAC OS X 10.8 上的 gcc 4.8 抛出“架构 x86_64 的未定义符号:”

链接上未定义的符号 ___gxx_personality_v0

架构 i386 的未定义符号:“_SCNetworkReachabilitySetCallback”