在OS X 10.11.6编译TensorFlow 13.1源码遇构造器初始化错误
解决OS X 10.11.6编译TensorFlow 1.13.1时的const初始化错误
我来帮你搞定这个编译报错,这个问题的核心是旧版本Clang编译器对C++标准中const对象初始化的严格要求导致的,咱们一步步来解决。
错误原因拆解
你碰到的这个错误:
tensorflow/core/grappler/graph_analyzer/graph_analyzer.cc:75:28: error: default initialization of an object of const type 'const Subgraph::Identity' without a user-provided default constructor const Subgraph::Identity empty_parent;
本质是Apple LLVM 8.0(clang-800.0.42.1)遵循更严格的C++规范:const类型的对象必须显式初始化,且如果类/结构体没有用户定义的默认构造函数,不能直接用const Type var;这种写法。而TensorFlow 1.13.1的这段代码是针对更新的编译器写的,那些编译器允许这种隐式初始化。
结合你的环境来看:
- 系统:OS X 10.11.6(El Capitan)
- 默认编译器:Apple LLVM 8.0.0
- Bazel版本:0.18.1/0.21.0
- 你虽然有Anaconda提供的clang 5.0,但Bazel默认调用了系统的Apple Clang
具体修复方案
方案1:修改TensorFlow源码(最直接的修复)
找到tensorflow/core/grappler/graph_analyzer/graph_analyzer.cc的第75行,把:
const Subgraph::Identity empty_parent;
改成:
const Subgraph::Identity empty_parent{};
这里用C++11的列表初始化语法,显式触发默认构造(哪怕是编译器自动生成的),旧版本Clang会认可这种写法。
方案2:强制Bazel用C++14标准编译
如果不想改源码,可以在编译时给Bazel传递C++标准参数:
bazel build --cxxopt="-std=c++14" //tensorflow/tools/pip_package:build_pip_package
C14对const对象默认初始化的规则更宽松,Apple LLVM 8.0完全支持C14,这样就能绕过这个错误。
方案3:切换到Anaconda的clang 5.0编译
你的系统里有Anaconda提供的clang 5.0,这个版本对C++标准的支持更完善,可以让Bazel强制使用这个编译器:
export CC=/Users/davidlaxer/anaconda/bin/clang export CXX=/Users/davidlaxer/anaconda/bin/clang++ bazel build //tensorflow/tools/pip_package:build_pip_package
注意:用这个方案前要确保Anaconda的环境变量正确加载,避免出现依赖缺失的问题。
验证建议
优先试试方案1,修改的代码量极小,精准针对错误点,不容易引入其他问题。修改后如果编译通过,就可以继续后续的pip打包流程了。
内容的提问来源于stack exchange,提问作者dbl001
相关产品推荐
相关产品推荐

