未定义符号:_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 的未定义符号:”