在编译gRPC的过程中发现编译到最后弹出如下错误提示:
[PROTOC] Generating protobuf CC file from src/proto/grpc/channelz/channelz.proto
[GRPC] Generating gRPC's protobuf service CC file from src/proto/grpc/channelz/channelz.proto
/home/work/tools/grpc_1.11/bins/opt/grpc_cpp_plugin: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /home/work/tools/grpc_1.11/bins/opt/grpc_cpp_plugin)
/home/work/tools/grpc_1.11/bins/opt/grpc_cpp_plugin: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /home/work/tools/grpc_1.11/bins/opt/grpc_cpp_plugin)
--grpc_out: protoc-gen-grpc: Plugin failed with status code 1.
make: *** [/home/work/tools/grpc_1.11/gens/src/proto/grpc/channelz/channelz.grpc.pb.cc] Error 1
看到网上的解释大多都是让更新gcc版本的。由于公司统一开发机的gcc版本不方便升级,所以自己用了一天时间来查找这个问题到底是怎么引起的。最终却发现其实这样提示的原因是目前使用的编译指令和配置的libstdc++.so不一致造成的。
其实用时这么多的原因主要还是自己差错方向错误,一直以为是因为代码要求的版本太高导致本机gcc无法编译,尝试了多次降版本编译后发现还是不行,而且过程中发现另一台设备也是gcc 4.8.5版本却可以编译。
看了下自己的gcc、g++版本都和可以编译的设备一致,与libstdc++.so也是一致的。于是更加奇怪为何无法编译。
直到查看到Makefile中:
49 ifeq ($(HAS_CC),true)
50 DEFAULT_CC = cc
51 DEFAULT_CXX = c++
52 else
53 ifeq ($(HAS_GCC),true)
54 DEFAULT_CC = gcc
55 DEFAULT_CXX = g++
56 else
57 ifeq ($(HAS_CLANG),true)
58 DEFAULT_CC = clang
59 DEFAULT_CXX = clang++
60 else
61 DEFAULT_CC = no_c_compiler
62 DEFAULT_CXX = no_c++_compiler
想起来自己机器可能设置了cc和c++,导致一来编译指令直接是cc和c++。
看看编译时日志输出果然证实了该猜测:
libtool: compile: c++ -std=c++11 -DHAVE_CONFIG_H -I. -I.. -fPIC -O2 -Wframe-larger-than=16384 -g -pthread -DHAVE_PTHREAD=1 -DHAVE_ZLIB=1 -Wall -Wno-sign-compare -O2 -g -DNDEBUG -MT google/protobuf/compiler/plugin.pb.lo -MD -MP -MF google/protobuf/compiler/.deps/plugin.pb.Tpo -c google/protobuf/compiler/plugin.pb.cc -o google/protobuf/compiler/plugin.pb.o
发现都是c++,再一看c++的版本:
Using built-in specs.
COLLECT_GCC=c++
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.9.2/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ./configure --disable-multilib --enable-languages=c,c++
Thread model: posix
gcc version 4.9.2 (GCC)
吐血三升。。。。。
所以……最终把c++命令版本调一致就好了。
Done。