编译TensorFlow 1.15.5时依赖组件grpc编译失败的解决办法

问题现象描述

执行编译TensorFlow 1.15.5命令时提示external/grpc/src/core/lib/gpr/log_linux.cc:43:13: error: ambiguating new declaration of 'long int gettid()',信息如下:

关键过程、根本原因分析

关键错误信息:编译依赖组件grpc时,提示long int gettid()找不到。

1
2
external/grpc/src/core/lib/gpr/log_linux.cc:43:13: error: ambiguating new declaration of 'long int gettid()'
   43 | static long gettid(void) { return syscall(__NR_gettid); }

根本原因分析:依赖组件grpc定义的gettid函数与系统库glibc定义冲突。

结论、解决方案及效果

  1. 下载依赖组件grpc。

    1
    wget https://github.com/grpc/grpc/archive/4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz  --no-check-certificate
    

  2. 解压grpc并进入解压目录。

    1
    2
    tar -zxvf 4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz
    cd grpc-4566c2a29ebec0835643b972eb99f4306c4234a3
    

  3. 将下列文件中的gettid改为gettid_sys。

    • “src/core/lib/gpr/log_posix.cc”:第34和89行
    • “src/core/lib/gpr/log_linux.cc”:第43和73行
    • “src/core/lib/iomgr/ev_epollex_linux.cc”:第1106和1126行

    可以执行下列命令修改:

    grep -rl 'gettid' src/ | xargs sed -i 's/\bgettid/gettid_sys/g'

    修改前:

    修改后:

  4. 退出解压目录并压缩grpc包。

    1
    2
    cd ..
    tar -zcvf grpc-4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz grpc-4566c2a29ebec0835643b972eb99f4306c4234a3
    

  5. 计算grpc的sha256值。

    1
    sha256sum grpc-4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz
    

  6. 创建Bazel本地仓并将修改后的grpc拷贝到本地仓中(此处本地仓选择“/home/bazel_local”,用户可自定义)。

    1
    2
    mkdir /home/bazel_local
    cp grpc-4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz /home/bazel_local/
    

  7. 修改下载grpc的方式。

    1. 进入TensorFlow目录。
      1
      cd path/to/tensorflow/tensorflow-1.15.5
      
    2. 打开“tensorflow/workspace.bzl”文件。
      1
      vi tensorflow/workspace.bzl
      
    3. 按“i”进入编辑模式,修改“tensorflow/workspace.bzl”文件,在第514行替换新grpc压缩包的sha256值,在第517行后新增Bazel本地仓下载路径。

      修改前:

          511     # WARNING: make sure ncteisen@ and vpai@ are cc-ed on any CL to change the below rule
          512     tf_http_archive(
          513         name = "grpc",
          514         sha256 = "67a6c26db56f345f7cee846e681db2c23f919eba46dd639b09462d1b6203d28c",
          515         strip_prefix = "grpc-4566c2a29ebec0835643b972eb99f4306c4234a3",
          516         system_build_file = clean_dep("//third_party/systemlibs:grpc.BUILD"),
          517         urls = [
          518             "https://storage.googleapis.com/mirror.tensorflow.org/github.com/grpc/grpc/archive/4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz",
          519             "https://github.com/grpc/grpc/archive/4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz",
          520         ],
          521     )

      修改后:

          511     # WARNING: make sure ncteisen@ and vpai@ are cc-ed on any CL to change the below rule
          512     tf_http_archive(
          513         name = "grpc",
          514         sha256 = "f15ad57d5cf1ef6e4552ddcfc4b5c45ba098d520eff2f113669efae1ff5e892d",
          515         strip_prefix = "grpc-4566c2a29ebec0835643b972eb99f4306c4234a3",
          516         system_build_file = clean_dep("//third_party/systemlibs:grpc.BUILD"),
          517         urls = [
          518             "file:///home/bazel_local/grpc-4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz",
          519             "https://storage.googleapis.com/mirror.tensorflow.org/github.com/grpc/grpc/archive/4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz",
          520             "https://github.com/grpc/grpc/archive/4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz",
          521         ],
          522     )

      其中sha256值和Bazel本地仓路径,请根据实际填写。

    4. 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。

  8. 重新编译TensorFlow。

    1
    bazel build --config=v1 --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"  //tensorflow/tools/pip_package:build_pip_package