在Ubuntu 12.04中导入python2.7中的Tensorflow时出错。 'GLIBC_2.17找不到'

我已成功安装了与python的Tensorflow绑定。 但是当我尝试导入Tensorflow时,出现以下错误。

ImportError:找不到/lib/x86_64-linux-gnu/libc.so.6:'GLIBC_2.17'版本(/usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so )

我试图更新GLIBC_2.15到2.17,但没有运气。

我有同样的问题,所以使用Googlesearch我做了这些步骤:

$ sudo pip install --upgrade virtualenv $ virtualenv --system-site-packages ~/tensorflow $ cd ~/tensorflow $ source bin/activate $ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl $ cd /tmp $ wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb $ wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb $ mkdir libc6_2.17 $ cd libc6_2.17 $ ar p ../libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx $ ar p ../libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx $ cd - $ LD_LIBRARY_PATH=/tmp/libc6_2.17/lib/x86_64-linux-gnu/ /tmp/libc6_2.17/lib/x86_64-linux-gnu/ld-2.17.so bin/python local/lib/python2.7/site-packages/tensorflow/models/image/mnist/convolutional.py 

并退出:

 $ deactivate 

这对我行得通。

我试过BR_User解决scheme ,仍然有一个恼人的:

 ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found 

我在CentOS 6.7上,它也缺less一个更新的c ++标准库,所以build立在BR_User解决scheme上,我提取了正确的libstdc ++包,但是我发现不需要虚拟环境。

假设你已经安装了tensorflow,它会给出:

 mkdir ~/my_libc_env cd ~/my_libc_env wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb wget ftp://rpmfind.net/linux/sourceforge/m/ma/magicspecs/apt/3.0/x86_64/RPMS.lib/libstdc++-4.8.2-7mgc30.x86_64.rpm ar p libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx ar p libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx rpm2cpio libstdc++-4.8.2-7mgc30.x86_64.rpm| cpio -idmv 

然后运行python:

 LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/usr/lib64/" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python` 

如果它不起作用,我有另一种解决scheme ,但你不会喜欢它。

好的,这里是我在之前的回答中提到的另一个解决scheme,它比较棘手,但是应该始终在GLIBC> = 2.12和GLIBCXX> = 3.4.13的系统上工作。 在我的情况下,它是在CentOS 6.7上,但对于Ubuntu 12.04也是好的。

我们需要一个支持c ++ 11的gcc版本,可以在另一台机器上或者单独安装; 但暂时不行。

我们在这里要做的是编辑_pywrap_tensorflow.so二进制文件,以便“弱化”libc和libstdc ++依赖项,以便ld接受连接我们要创build的存根。 然后,我们将为缺less的符号创build这些存根,最后我们将在运行python时预加载所有这些。

首先,我要感谢詹姆斯的伟大的文章( http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc )和宝贵的build议,我不能没有他。

所以,让我们开始减弱依赖关系,只是在_pywrap_tensorflow.so中replace正确的字节。 请注意,此步骤仅适用于当前版本的张量stream(0.6.0)。 所以如果没有完成创build和激活你的virtualenv,如果你有一个(如果你不是pipe理virtualenv是一个解决scheme,另一个是添加 – 用户标志到PIP命令),并安装tensorflow 0.6.0(replaceCPU gpu在url,如果你想要的GPU版本):

 pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.6.0-cp27-none-linux_x86_64.whl 

让我们弱化所有烦人的依赖关系,这里是tensorflow的cpu版本的命令:

 TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module('tensorflow')[1])"` for addr in 0xC6A93C 0xC6A99C 0xC6A9EC 0xC6AA0C 0xC6AA1C 0xC6AA3C; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done 

这里是一个GPU(只运行正确的,否则你会破坏二进制):

 TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module('tensorflow')[1])"` for addr in 0xDC5EA4 0xDC5F04 0xDC5F54 0xDC5F74 0xDC5F84 0xDC5FA4; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done 

你可以检查它:

 readelf -V ${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so 

看看这篇文章,如果你想了解这里发生了什么。

现在我们将为缺less的libc符号创build存根:

 mkdir ~/my_stubs cd ~/my_stubs MYSTUBS=~/my_stubs printf "#include <time.h>\n#include <string.h>\nvoid* memcpy(void *dest, const void *src, size_t n) {\nreturn memmove(dest, src, n);\n}\nint clock_gettime(clockid_t clk_id, struct timespec *tp) {\nreturn clock_gettime(clk_id, tp);\n}" > mylibc.c gcc -s -shared -o mylibc.so -fPIC -fno-builtin mylibc.c 

需要在缺less依赖关系的计算机上执行该步骤(或者具有类似版本的标准库的机器(例如在群集中))。

现在我们可能会改变机器,因为我们需要一个支持c ++ 11的gcc,而且它可能不在机器上缺less所有的依赖(或者你可以使用一个最近的gcc的独立安装)。 在下面,我假设我们还在~/my_stubs ,不知何故,你在机器上分享你的家,否则你只需要复制我们在完成时生成的.so文件。

所以,我们可以为libstdc ++做一个存根,剩下的就是我们要从gcc源代码编译它们(克隆存储库可能需要一些时间):

 printf "#include <functional>\nvoid std::__throw_bad_function_call(void) {\nexit(1);\n}" > bad_function.cc gcc -std=c++11 -s -shared -o bad_function.so -fPIC -fno-builtin bad_function.cc git clone https://github.com/gcc-mirror/gcc.git cd gcc mkdir my_include mkdir my_include/ext cp libstdc++-v3/include/ext/aligned_buffer.h my_include/ext gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hashtable.so -fPIC -fno-builtin libstdc++-v3/src/c++11/hashtable_c++0x.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/chrono.so -fPIC -fno-builtin libstdc++-v3/src/c++11/chrono.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/random.so -fPIC -fno-builtin libstdc++-v3/src/c++11/random.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hash_bytes.so -fPIC -fno-builtin ./libstdc++-v3/libsupc++/hash_bytes.cc 

而就是这样! 您现在可以通过预加载我们所有的共享库(以及您的本地libstdc ++)来运行tensorflow python脚本:

 LIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d' ' -f4` #For 64bit machines LD_PRELOAD="$MYSTUBS/mylibc.so:$MYSTUBS/random.so:$MYSTUBS/hash_bytes.so:$MYSTUBS/chrono.so:$MYSTUBS/hashtable.so:$MYSTUBS/bad_function.so:$LIBSTDCPP" python ${TENSORFLOW_DIR}/models/image/mnist/convolutional.py 

🙂

我刚刚在CentOS 6.5上用glibc 2.12安装了tensorflow 0.12rc0,没有root权限。 通过pip简单地安装tensorflow二进制文件给我一个错误,也与GLIBC版本有关。

基本上,你有4个选项如何处理这个(每个有一些优点和缺点):

选项1 – 全球升级您的系统GLIBC。

这可能是最好的select, 如果你的系统支持这个 ,你有root权限,并且你确信这个升级不会因为某种奇怪的原因而破坏任何东西。 最终,这升级了整个Linux发行版。 这里是stream行发行版的默认GLIBC版本的简短列表。

选项2 – 将第二个GLIBC添加到您的系统

编译或下载二进制文件 。 最简单和直接的select。 特别是如果你只需要运行几个简单的脚本 。

  • 在同一个系统上可能有多个版本的glibc,但是应该非常小心的做到这一点。
  • 如果您所做的更改仅限于虚拟环境,则不会破坏您的系统。
  • 以前安装/编译的许多程序可能依赖于旧的GLIBC, 只会在新的环境中崩溃 (例如,您的Python IDE)。 包括最基本的bash命令,如“lc”,“cd”等
  • 其他副作用如重大的内存泄漏也是可能的。
  • 因此, 将新的GLIBC添加到常规环境中是一个非常糟糕的主意,例如通过.bashrc
  • 另一方面,如果你在新的虚拟环境中需要一些特定的工具,你可以重新编译它,链接到新的GLIBC 。 所以,在你的新环境中,这样做还是可以的。
  • 但是,个人而言,我很快放弃了在新环境下重新编译我所需要的一切(没有root和一个包pipe理器)。
  • GLIBC开发人员正式提供了一种稍微不同的方法来testing新的GLIBC版本。

选项3 – 补丁tensorflow

这可能适用于TF 0.6.0,但是当每个新的tensorflow版本发布时,您可能不得不重新开始。 例如这里是一个0.9.0的修复。

选项4 – 从源编译tensorflow

如果你从源代码重新编译它并且链接到现有的GLIBC,那么不再需要更新的GLIBC。 不知何故,这个选项在这里没有提到任何答案。 Imho,这是最好的select,“ 一般 ”,“专为tensorflow”。

  • 这对于r0.11是行得通的,可能会工作多年,但理论上,如果他们决定实际使用一些新的GLIBCfunction,而不是旧版本,它可能会在一些新的张量stream版本中打破。
  • 说实话,从源头上构buildtensorflow并不简单,特别是在过时的系统上。

“build立过时系统张量”的快速总结

虽然官方指南提供了“ 从源代码安装 ”部分,但是在过时的系统上构build它需要做很less的技巧。 在这里,我假设你没有root权限(如果你这么做的话 – 你可能会用一个包pipe理器来安装相同的预先请求,而不是从源代码手动构build它们)。

我发现了两个有据可查的成功案例: #1 , #2和官方github上的许多有用的post(主要是关于二进制内部链接的一组库): #1 , #2 , #3 , #4 。 我必须结合技巧,在那里描述成功编译TF在我的情况。

  1. 首先,检查你的gcc --version ,并确认它支持c ++ 11。 矿是4.4.7,所以它不会工作。 我已经下载了 gcc-4.9.4源代码,并编译它 。 这一步很简单,但编译本身可能需要几个小时。 作为bazel中的一个问题的解决方法,我已经编译了gcc, 硬编码的path为asldnm 。 但是,您可以尝试另一种解决方法:( 1,2 )。

     #!/bin/sh unset LIBRARY_PATH CPATH C_INCLUDE_PATH unset PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH cd gcc-4.9.4 ./contrib/download_prerequisites mkdir objdir cd objdir # I've added --disable-multilib to fix the following error: # /usr/bin/ld: crt1.o: No such file: No such file or directory # collect2: ld returned 1 exit status # configure: error: I suspect your system does not have 32-bit # developement libraries (libc and headers). If you have them, # rerun configure with --enable-multilib. If you do not have them, # and want to build a 64-bit-only compiler, rerun configure # with --disable-multilib. ../configure --prefix=$HOME/opt/gcc-4.9.4 \ --disable-multilib \ --disable-nls \ --enable-languages=c,c++ \ --with-ld=/usr/bin/ld \ --with-nm=/usr/bin/nm \ --with-as=/usr/bin/as make make install 
  2. 检查你的java --version 。 Bazel需要JDK 8,如果需要的话安装。 (他们仍然提供一些jdk7相关的下载,对于bazel-0.4.1,但看起来他们认为这已经被弃用了)

  3. 我创build了一个单独的use_gcc_4.9.4.sh文件,其中包含必要的环境variables。 当我需要与这个新的编译器相关的东西时,我使用source ./use_gcc_4.9.4.sh

     #!/bin/sh this=$HOME/opt/gcc-4.9.4 export PATH=$this/bin:$PATH export CPATH=$this/include:$CPATH export LIBRARY_PATH=$this/lib:$LIBRARY_PATH export LIBRARY_PATH=$this/lib64:$LIBRARY_PATH export LD_LIBRARY_PATH=$this/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=$this/lib64:$LD_LIBRARY_PATH 
  4. 当前的bazel二进制(0.4.1) 需要GLIBC 2.14 ,所以我们必须从源代码编译bazel (使用我们的新gcc)。 工作正常,除非您只允许在目标机器上运行非常有限数量的线程 。 ( 这篇文章介绍了一些额外的解决方法,但在我的情况下,他们并不需要,也许是由于bazel代码最近的更新。)

  5. 获取张量stream源代码git clone https://github.com/tensorflow/tensorflow ,并安装你需要的先决条件(CUDA,cuDNN,python等)。 见官方指南 。

  6. 如果你没有使用默认的系统gcc(例如,如果你不得不编译新的gcc,就像上面讨论的那样),将下面的链接标志添加到tensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl , 第59行 :

     linker_flag: "-L/home/username/localinst/opt/gcc-4.9.4/lib64" linker_flag: "-Wl,-rpath,/home/username/localinst/opt/gcc-4.9.4/lib64" 

    没有这一步,你可能会遇到像这样的错误消息:

     # ERROR: /home/username/localdistr/src/tensorflow/tensorflow/tensorflow/core/debug/BUILD:33:1: null failed: protoc failed: error executing command bazel-out/host/bin/external/protobuf/protoc '--cpp_out=bazel-out/local_linux-py3-opt/genfiles/' '--plugin=protoc-gen-grpc=bazel-out/host/bin/external/grpc/grpc_cpp_plugin' ... (remaining 8 argument(s) skipped): com.google.devtools.build.lib.shell.BadExitStatusException: Process exited with status 1. # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by bazel-out/host/bin/external/protobuf/protoc) # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by bazel-out/host/bin/external/protobuf/protoc) # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by bazel-out/host/bin/external/protobuf/protoc) 
  7. 最后,为了避免GLIBC依赖,我们必须通过添加-lrt链接器标志( 也许是 -lm )来静态链接一些库。 我发现多个post,build议以不同的方式添加这个post:

    • 通过bazel命令行 (可能听起来合理,但不适合当前tensorflow版本,我不知道),
    • 通过“bazel-tensorflow / external / protobuf / BUILD” (不知道它是否工作,但这看起来不太方便 – 这个文件只在构build尝试本身时创build)
    • 通过“third_party / gpus / crosstool / CROSSTOOL.tpl” (我们刚刚在上一步中编辑过的同一个文件,就在我们已经添加的行的下面)。

       linker_flag: "-lrt" linker_flag: "-lm" 
    • 通过“tensorflow / tensorflow.bzl” (适用于我,但不太方便,因为你必须编辑一个文件,我不确定它是否与前一点相当)

    没有-lrt我再次遇到GLIBC版本特定的错误,试图import tensorflow

     # ImportError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/username/anaconda3/envs/myenvname/lib/python3.5/site-packages/tensorflow/python/_pywrap_tensorflow.so) 

    没有-lm你可能会遇到这个 (对我来说,事实certificate这是没有必要的)。

  8. 运行构build过程。

  source ./use_gcc_4.9.4.sh ./configure bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg pip install --upgrade /tmp/tensorflow_pkg/tensorflow-0.12.0rc0-cp35-cp35m-linux_x86_64.whl 
  1. 尝试运行以下简单的python脚本来testing最基本的东西是否正常运行:

     import tensorflow as tf hello = tf.constant('Hello, TensorFlow!') sess = tf.Session() print(sess.run(hello)) a = tf.constant(10) b = tf.constant(32) print(sess.run(a + b)) 

如果你的GNU C库不是最新的,那么这个错误主要是出现的。 您可以使用简单的方式来检查您正在运行的版本

 $ ldd --version 

输出应该是这样的:

 ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Roland McGrath and Ulrich Drepper. 

2.19是你的GLIBC版本。 要升级,您可以访问GNU-C Library项目网站并下载最新版本。 最新glibc的链接在这里: GNU-C库下载在写这个答案的时候, 最新的稳定版本是2.22

我试过在Ubuntu 12.04和14.04上运行tensorflow。 Ubuntu 14.04不会抛出这个问题,因为它默认安装了glibc 2.19。

希望它有帮助。

我的解决scheme与Theo T类似, 虽然微调了Xubuntu 12.04(CAELinux 2013)

 sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.6.0-cp27-none-linux_x86_64.whl sudo su # prompt for password TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module('tensorflow')[1])"` for addr in 0xC6A93C 0xC6A99C 0xC6A9EC 0xC6AA0C 0xC6AA1C 0xC6AA3C; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done readelf -V ${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so exit mkdir ~/.my_stubs cd ~/.my_stubs MYSTUBS=~/.my_stubs printf "#include <time.h>\n#include <string.h>\nvoid* memcpy(void *dest, const void *src, size_t n) {\nreturn memmove(dest, src, n);\n}\nint clock_gettime(clockid_t clk_id, struct timespec *tp) {\nreturn clock_gettime(clk_id, tp);\n}" > mylibc.c gcc -s -shared -o mylibc.so -fPIC -fno-builtin mylibc.c printf "#include <functional>\nvoid std::__throw_bad_function_call(void) {\nexit(1);\n}" > bad_function.cc gcc -std=c++11 -s -shared -o bad_function.so -fPIC -fno-builtin bad_function.cc git clone https://github.com/gcc-mirror/gcc.git cd gcc mkdir my_include mkdir my_include/ext cp libstdc++-v3/include/ext/aligned_buffer.h my_include/ext gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hashtable.so -fPIC -fno-builtin libstdc++-v3/src/c++11/hashtable_c++0x.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/chrono.so -fPIC -fno-builtin libstdc++-v3/src/c++11/chrono.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/random.so -fPIC -fno-builtin libstdc++-v3/src/c++11/random.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hash_bytes.so -fPIC -fno-builtin ./libstdc++-v3/libsupc++/hash_bytes.cc 

以下两个步骤将运行位于tensorflow / models / image / mnist目录中的convolution.py脚本:

 LIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d' ' -f4` #For 64bit machines LD_PRELOAD="$MYSTUBS/mylibc.so:$MYSTUBS/random.so:$MYSTUBS/hash_bytes.so:$MYSTUBS/chrono.so:$MYSTUBS/hashtable.so:$MYSTUBS/bad_function.so:$LIBSTDCPP" python ${TENSORFLOW_DIR}/models/image/mnist/convolutional.py 

如果你想让python始终加载这些简化的依赖关系,只需使用以下步骤将其添加到.bashrc文件中:

 echo "LIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d' ' -f4`" >> ~/.bashrc echo alias python="'"LD_PRELOAD='"''$'MYSTUBS/mylibc.so:'$'MYSTUBS/random.so:'$'MYSTUBS/hash_bytes.so:'$'MYSTUBS/chrono.so:'$'MYSTUBS/hashtable.so:'$'MYSTUBS/bad_function.so:'$'LIBSTDCPP'"' python"'" >> ~/.bashrc 

如果你有ipython:

 echo alias ipython="'"LD_PRELOAD='"''$'MYSTUBS/mylibc.so:'$'MYSTUBS/random.so:'$'MYSTUBS/hash_bytes.so:'$'MYSTUBS/chrono.so:'$'MYSTUBS/hashtable.so:'$'MYSTUBS/bad_function.so:'$'LIBSTDCPP'"' ipython"'" >> ~/.bashrc 

基本上,我更新到python安装在dist_packages而不是站点包完成。 另外,我从gcc镜像克隆而不是gcc的本地git页面。 rest都是一样的。

最后几个步骤确保每次运行python或ipython时,它都会加载减less的依赖关系。

@ThéoT的答案中的链接不再有效,所以我不得不尝试几种方法来find一个可行的方法。

 mkdir ~/my_libc_env cd ~/my_libc_env wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb wget ftp://ftp.icm.edu.pl/vol/rzm5/linux-slc/centos/7.0.1406/cr/x86_64/Packages/libstdc++-4.8.3-9.el7.x86_64.rpm ar p libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx ar p libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx rpm2cpio libstdc++-4.8.3-9.el7.x86_64.rpm| cpio -idmv 

用tensorflow运行python代码

 LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/usr/lib64/" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python` your_program.py 

注意Theo Trouillon的“弱化”解决scheme。 它只适用于Tensorflow 0.6.0。 如果您想将其应用于Tensorflow 0.9.0,则会变得棘手。 我的情况是CPU模式,Centos 6.7,其中GLIBC 2.12 GLIBCXX 3.4.13。

安装tensorflow:

 pip uninstall protobuf pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl 

“弱化”的代码应该改变:

 TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module('tensorflow')[1])"` for addr in 0x376e34 0x376e94 0x376ef4 0x376f14 0x376f24 0x376f44 0x376f54 ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done for addr in 0x93aa4 0x93b04 ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/layers/python/ops/_bucketization_op.so bs=1 seek=$((addr)) ; done for addr in 0x95bec 0x95c4c ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/layers/python/ops/_sparse_feature_cross_op.so bs=1 seek=$((addr)) ; done for addr in 0x9ffec 0x9fffc 0xa005c ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/metrics/python/ops/_set_ops.so bs=1 seek=$((addr)) ; done for addr in 0x96aa4 0x96b04 0x96b24; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/linear_optimizer/python/ops/_sdca_ops.so bs=1 seek=$((addr)) ; done 

下面的代码应该被添加到新机器的存根生成代码。

 mkdir my_include/bits cp libstdc++-v3/include/bits/shared_ptr_atomic.h my_include/bits/ cp libstdc++-v3/include/std/memory my_include/ gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o ${MYSTUBS}/shared_ptr.so -fPIC -fno-builtin ./libstdc++-v3/src/c++11/shared_ptr.cc gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o ${MYSTUBS}/list.so -fPIC -fno-builtin ./libstdc++-v3/src/c++98/list.cc echo " #include <unistd.h> #include <stdlib.h> char * secure_getenv (const char *name) { if ((getuid () == geteuid ()) && (getgid () == getegid ())) return getenv (name); else return NULL; }" > getenv.cc gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o ${MYSTUBS}/getenv.so -fPIC -fno-builtin getenv.cc 

当然,最后的运行代码应该被修改以包含额外的存根。

 LD_PRELOAD="$MYSTUBS/list.so:$MYSTUBS/mylibc.so:$MYSTUBS/shared_ptr.so:$MYSTUBS/getenv.so:$MYSTUBS/random.so:$MYSTUBS/hash_bytes.so:$MYSTUBS/chrono.so:$MYSTUBS/hashtable.so:$MYSTUBS/bad_function.so:$LIBSTDCPP" python ${TENSORFLOW_DIR}/models/image/mnist/convolutional.py 

我已经尝试了https://stackoverflow.com/a/34897674/5929065解决scheme,它的工作完美。; 但是,libstdc ++ – 4.8.2-7下载链接不能再被访问,请尝试从这个页面中选取一个新链接: http ://rpm.pbone.net/index.php3/stat/4/idpl/31981489/dir /centos_7/com/libstdc++-4.8.5-4.el7.x86_64.rpm.html

对我来说,我用这个:

wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.2.1511/os/x86_64/Packages/libstdc++-4.8.5-4.el7.x86_64.rpm

注意:你应该通过你的平台下载deb包:

86:

https://launchpad.net/ubuntu/raring/i386/libc6/2.17-0ubuntu5.1

 wget http://launchpadlibrarian.net/151932048/libc6_2.17-0ubuntu5.1_i386.deb sudo dpkg -i libc6_2.17-0ubuntu5.1_i386.deb 

64位:

https://launchpad.net/ubuntu/raring/amd64/libc6/2.17-0ubuntu5.1

 wget http://launchpadlibrarian.net/151925896/libc6_2.17-0ubuntu5.1_amd64.deb sudo dpkg -i libc6_2.17-0ubuntu5.1_amd64.deb 

testing我的12.04 Ubuntu x64。

上面的答案没有问题,但是在做完之后我仍然遇到一些问题。 我跟在@Theo回答在rhel和我试图导出LD_LIBRARY_PATH哪些已经引发了一些错误,随着LD_LIBRARY_PATH还包括LD_PRELOAD作为

 mkdir libstdc cd libstdc rpm2cpio ../libstdc++-4.8.3-9.el7.x86_64.rpm| cpio -idmv LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/lib64/" LD_PRELOAD="$HOME/my_libc_env/libstdc/usr/lib64/libstdc++.so.6.0.19" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python` 

你必须在运行python的时候总是这么做,所以创build一个加载这些variables并调用python解释器的脚本

 vim tmp.sh LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/lib64/" LD_PRELOAD="$HOME/my_libc_env/libstdc/usr/lib64/libstdc++.so.6.0.19" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python`