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所在的地方)。不过这个方法容易被覆盖,仅作备选:
- 先跑一次
bazel configure,让Bazel生成CUDA的配置文件 - 找到
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) - 保存后重新编译就行
注意:如果执行bazel clean或者重新bazel configure,这里修改的内容会被重置,所以还是前两种方法更靠谱。
临时救急:给报错代码打补丁
要是上面的方法暂时没生效,还能先给出错的源文件加个临时补丁:在报错代码的开头加上#include <errno.h>,先绕过这个编译错误,等编译器切换正确后再删掉就行。
内容的提问来源于stack exchange,提问作者heethesh
相关产品推荐
相关产品推荐

