Ubuntu14.04下Ninja构建报错:缺失GLIBCXX_3.4.20/3.4.21版本
解决Ubuntu 14.04下构建项目时libstdc++.so.6版本缺失问题
我在Ubuntu 14.04.5 LTS上尝试执行以下GN和Ninja构建命令:
gn gen PathToBinary --args='is_debug=false symbol_level=0 proprietary_codecs=true ffmpeg_branding="Chrome" use_cfi_diag=true enable_nacl=false treat_warnings_as_errors = true' ninja -C PathToBinary path
执行后遇到了protoc依赖的libstdc++版本不足的错误:
[1/10551] ACTION //cc/proto:proto_internal_gen(//build/toolchain/linux:clang_x64) FAILED: pyproto/cc/proto/memory_allocation_pb2.py gen/cc/proto/memory_allocation.pb.cc gen/cc/proto/memory_allocation.pb.h python ../../tools/protoc_wrapper/protoc_wrapper.py --include cc/proto/cc_proto_export.h --protobuf gen/cc/proto/memory_allocation.pb.h --proto-in-dir ../../cc/proto --proto-in-file memory_allocation.proto --use-system-protobuf=0 -- ./protoc --cpp_out dllexport_decl=CC_PROTO_EXPORT:gen/cc/proto --python_out pyproto/cc/proto ./protoc: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./protoc) ./protoc: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by ./protoc)
问题原因
Ubuntu 14.04默认搭载的libstdc++6版本比较旧,不支持protoc需要的GLIBCXX_3.4.20和GLIBCXX_3.4.21版本,导致protoc无法正常运行。
解决方案
方案一:手动更新系统的libstdc++库
- 先检查当前系统支持的GLIBCXX版本,确认确实缺失目标版本:
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX - 下载Ubuntu 16.04版本的libstdc++6包(该版本包含所需的GLIBCXX版本):
wget http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.12_amd64.deb - 解压deb包到临时目录:
dpkg-deb -x libstdc++6_5.4.0-6ubuntu1~16.04.12_amd64.deb temp_dir - 备份原库文件并替换为新版本:
sudo cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.backup sudo cp temp_dir/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 /usr/lib/x86_64-linux-gnu/ sudo ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 - 验证更新结果,再次执行第一步的命令,应该能看到
GLIBCXX_3.4.20和GLIBCXX_3.4.21出现在列表中。
方案二:使用clang的libc替代系统libstdc
如果不想修改系统库,可以在GN的构建参数中添加use_libcxx=true,让构建过程使用clang自带的libc库,绕过系统旧版本libstdc的限制:
gn gen PathToBinary --args='is_debug=false symbol_level=0 proprietary_codecs=true ffmpeg_branding="Chrome" use_cfi_diag=true enable_nacl=false treat_warnings_as_errors=true use_libcxx=true'
之后再执行ninja -C PathToBinary path即可。
方案三:升级操作系统(谨慎选择)
如果项目允许,可以把系统升级到Ubuntu 16.04或更高版本,这些版本默认搭载的libstdc++版本原生支持GLIBCXX_3.4.20和GLIBCXX_3.4.21,从根本上解决版本问题。不过升级系统可能会影响其他依赖的软件,需要提前做好备份和兼容性测试。
内容的提问来源于stack exchange,提问作者rim
相关产品推荐
相关产品推荐

