You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 17.10下如何强制Bazel使用GCC编译TensorFlow源码?

强制Bazel使用gcc-5编译TensorFlow r1.5的解决方案

我完全懂你遇到的糟心情况:明明想让Bazel调用系统的gcc-5,结果它偏偏用了CUDA交叉工具链里的clang wrapper,搞出errno未声明的编译错误,连找CROSSTOOL文件都找不到。下面是几个亲测有效的解决办法:

方法一:用环境变量直接指定编译器(最省心)

不用改任何配置文件,在执行Bazel编译命令前先设置环境变量,直接给Bazel"下命令":

export CC=/usr/bin/gcc-5
export CXX=/usr/bin/g++-5
# 接着执行你的TensorFlow编译命令,比如:
bazel build --config=cuda //tensorflow/tools/pip_package:build_pip_package

这个操作会让Bazel全局使用你指定的gcc-5和g++-5,直接覆盖默认的工具链。

方法二:修改TensorFlow的.bazelrc文件(一劳永逸)

如果不想每次编译都手动输环境变量,直接修改TensorFlow源码目录下的.bazelrc文件,添加以下内容:

build --action_env=CC=/usr/bin/gcc-5
build --action_env=CXX=/usr/bin/g++-5

之后每次执行Bazel命令时,都会自动加载这些配置,强制用指定的编译器干活。

方法三:调整CUDA工具链配置(针对找不到CROSSTOOL的情况)

你说找不到tools/cpp/CROSSTOOL,是因为TensorFlow r1.5里,CUDA的工具链配置已经移到external/local_config_cuda目录下了(就是你看到的那个clang wrapper所在的地方)。不过这个方法容易被覆盖,仅作备选:

  1. 先跑一次bazel configure,让Bazel生成CUDA的配置文件
  2. 找到external/local_config_cuda/crosstool/CROSSTOOL,打开后找到toolchain节点下的gcc_toolchain配置,把path改成/usr/bin/gcc-5,同时把cxx_builtin_include_directory指向gcc-5的头文件目录(一般是/usr/lib/gcc/x86_64-linux-gnu/5/include)
  3. 保存后重新编译就行

注意:如果执行bazel clean或者重新bazel configure,这里修改的内容会被重置,所以还是前两种方法更靠谱。

临时救急:给报错代码打补丁

要是上面的方法暂时没生效,还能先给出错的源文件加个临时补丁:在报错代码的开头加上#include <errno.h>,先绕过这个编译错误,等编译器切换正确后再删掉就行。

内容的提问来源于stack exchange,提问作者heethesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:37:49