Solaris 11下protoc执行报错:缺失GLIBCXX_3.4.20版本的libstdc++.so.6
解决Solaris 11中protoc依赖GLIBCXX_3.4.20缺失的问题
你的核心问题是系统默认的libstdc++.so.6版本过低,没法满足protoc和libprotobuf.so.15对GLIBCXX_3.4.20的依赖需求。Solaris 11自带的gcc/libstdc++通常版本偏老(比如gcc 4.7及以下),而GLIBCXX_3.4.20是gcc 4.8及以上版本才引入的特性。下面是具体的解决步骤:
1. 安装高版本gcc(推荐方案)
Solaris 11的pkg包管理器提供了较新的gcc版本,直接通过包管理安装最省心:
# 这里以安装gcc 7为例,也可以选择更高版本如gcc-9 pkg install gcc-7
安装完成后,验证新gcc的libstdc++是否包含所需版本:
# x86架构执行这条 strings /usr/gcc/7/lib/amd64/libstdc++.so.6 | grep GLIBCXX_3.4.20 # SPARC架构则用这条 strings /usr/gcc/7/lib/sparcv9/libstdc++.so.6 | grep GLIBCXX_3.4.20
正常情况下会输出GLIBCXX_3.4.20的条目,说明库版本符合要求。
2. 让protoc调用新的libstdc++运行
有两种方式可以让protoc找到正确的依赖库:
方式一:临时设置环境变量
在执行protoc命令前,先指定新libstdc++的路径:
# x86架构 export LD_LIBRARY_PATH=/usr/gcc/7/lib/amd64:$LD_LIBRARY_PATH # SPARC架构 export LD_LIBRARY_PATH=/usr/gcc/7/lib/sparcv9:$LD_LIBRARY_PATH # 接着执行你的protoc命令即可 protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto
方式二:重新编译protobuf(更彻底)
如果之前你是用系统默认gcc编译的protobuf,建议用新安装的gcc重新编译一次,这样生成的protoc会默认绑定新的libstdc++:
# 进入protobuf源码目录,先清理之前的编译残留 make clean && rm -rf config.log config.status # 指定用新的gcc/g++进行编译配置 ./configure CC=gcc-7 CXX=g++-7 make && make install
重新编译完成后,protoc会自动关联新的libstdc++,无需每次手动设置环境变量。
3. 永久配置环境变量(可选)
如果不想每次启动shell都手动设置LD_LIBRARY_PATH,可以把路径添加到用户的shell配置文件中:
# 编辑~/.bashrc(如果用的是bash)或者~/.profile echo 'export LD_LIBRARY_PATH=/usr/gcc/7/lib/amd64:$LD_LIBRARY_PATH' >> ~/.bashrc # 让配置立即生效 source ~/.bashrc
注意:如果是SPARC架构,记得把路径中的amd64替换为sparcv9。
内容的提问来源于stack exchange,提问作者Shivam
相关产品推荐
相关产品推荐

