编译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时,提示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定义冲突。
结论、解决方案及效果
- 下载依赖组件grpc。
1
wget https://github.com/grpc/grpc/archive/4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz --no-check-certificate
- 解压grpc并进入解压目录。
1 2
tar -zxvf 4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz cd grpc-4566c2a29ebec0835643b972eb99f4306c4234a3
- 将下列文件中的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'
修改前:
修改后:
- 退出解压目录并压缩grpc包。
1 2
cd .. tar -zcvf grpc-4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz grpc-4566c2a29ebec0835643b972eb99f4306c4234a3
- 计算grpc的sha256值。
1
sha256sum grpc-4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz
- 创建Bazel本地仓并将修改后的grpc拷贝到本地仓中(此处本地仓选择“/home/bazel_local”,用户可自定义)。
1 2
mkdir /home/bazel_local cp grpc-4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz /home/bazel_local/
- 修改下载grpc的方式。
- 进入TensorFlow目录。
1
cd path/to/tensorflow/tensorflow-1.15.5
- 打开“tensorflow/workspace.bzl”文件。
1
vi tensorflow/workspace.bzl
- 按“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本地仓路径,请根据实际填写。
- 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
- 进入TensorFlow目录。
- 重新编译TensorFlow。
1
bazel build --config=v1 --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" //tensorflow/tools/pip_package:build_pip_package
父主题: 故障排除