问题现象描述
执行编译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()找不到。
| 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。
| wget https://github.com/grpc/grpc/archive/4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz --no-check-certificate
|
- 解压grpc并进入解压目录。
| 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包。
| cd ..
tar -zcvf grpc-4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz grpc-4566c2a29ebec0835643b972eb99f4306c4234a3
|
- 计算grpc的sha256值。
| sha256sum grpc-4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz
|
- 创建Bazel本地仓并将修改后的grpc拷贝到本地仓中(此处本地仓选择“/home/bazel_local”,用户可自定义)。
| mkdir /home/bazel_local
cp grpc-4566c2a29ebec0835643b972eb99f4306c4234a3.tar.gz /home/bazel_local/
|
- 修改下载grpc的方式。
- 进入TensorFlow目录。
| cd path/to/tensorflow/tensorflow-1.15.5
|
- 打开“tensorflow/workspace.bzl”文件。
| 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。
| bazel build --config=v1 --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" //tensorflow/tools/pip_package:build_pip_package
|