Aiyyaa
Aiyyaa

Reputation: 85

gRPC doesn't produce libraries for c++ on ubuntu

When I tried to run example of gRPC for c++ in folder grpc/examples/cpp/helloworld it requires libraries which weren't compiled when I built gRPC with Cmake

Firstly I built gRPC in Ububtu 16.04 with instructions:

$ git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
$ cd grpc
$ git submodule update --init
$ cd third_party/protobuf
$ git submodule update --init --recursive
$ ./autogen.sh
$ ./configure --prefix=/usr
$ make
$ make check
$ sudo make install
$ sudo ldconfig # refresh shared library cache.
$ pkg-config --cflags protobuf         # print compiler flags
$ pkg-config --libs protobuf           # print linker flags
$ pkg-config --cflags --libs protobuf  # print both
cd ../..
make
sudo make install 

After that I tried to run example in folder grpc/examples/cpp/helloworld

grps/grpc/examples/cpp/helloworld$ make

i got several mistakes, which were resolved by copying grpc_cpp_plugin from folder grpc/bins/opt to /usr/local/bin and grpc++.pc and grpc++_unsecure.pc from grpc/libs/opt/pkgconfig/ to /usr/local/lib/pkgconfig. When I tried for the next time command

grpc/examples/cpp/helloworld$ make

I've got message

g++ helloworld.pb.o helloworld.grpc.pb.o greeter_client.o -L/usr/local/lib `pkg-config --libs protobuf grpc++ grpc` -pthread -Wl,--no-as-needed -lgrpc++_reflection -Wl,--as-needed -ldl -o greeter_client
/usr/bin/ld: cannot find -lgrpc++
/usr/bin/ld: cannot find -lgrpc++_reflection
collect2: error: ld returned 1 exit status
Makefile:44: recipe for target 'greeter_client' failed
make: *** [greeter_client] Error 1

So, I searched these libs libgrpc++ in folder grpc/libs/opt, but there only these libraries

grpc/libs/opt$ ls --l 
libaddress_sorting.a         libgrpc_cronet.so.8
libaddress_sorting.so        libgrpc_cronet.so.8.0.0
libaddress_sorting.so.8      libgrpc_plugin_support.a
libaddress_sorting.so.8.0.0  libgrpc.so
libares.a                    libgrpc.so.8
libboringssl.a               libgrpc.so.8.0.0
libgpr.a                     libgrpc_unsecure.a
libgpr.so                    libgrpc_unsecure.so
libgpr.so.8                  libgrpc_unsecure.so.8
libgpr.so.8.0.0              libgrpc_unsecure.so.8.0.0
libgrpc.a                    pkgconfig
libgrpc_cronet.a             protobuf
libgrpc_cronet.so

So make didn't compile static and dynamic libraries for gRPC. Is it I did something wrong or didn't something or there is a bug? Version of protobuf is

:~$ protoc --version
libprotoc 3.8.0
:~$ which protoc
/usr/bin/protoc

Here is some output after I run "make" from root directory

[MAKE]    Generating /home/user/cpp_test/grps/grpc/libs/opt/pkgconfig/grpc++.pc
[MAKE]    Generating /home/user/cpp_test/grps/grpc/libs/opt/pkgconfig/grpc++_unsecure.pc

So it creates pkgconfig files for "libgrpc++*" libraries, but doesn't create these libraries.
And these having libgrpc++

 libgrpc++ depbase=`echo google/protobuf/io/tokenizer.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\

and

libgrpc++ depbase=`echo google/protobuf/util/delimited_message_util.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\

only two lines

Upvotes: 0

Views: 5452

Answers (2)

Aiyyaa
Aiyyaa

Reputation: 85

So, I resolved this problem. When I run "make" on root gRPC folder, compilation ended with such result:

[CXX]     Compiling /home/user/cpp_test/grps/grpc/gens/src/proto/grpc/core/stats.pb.cc
/home/user/cpp_test/grps/grpc/gens/src/proto/grpc/core/stats.pb.cc:187:13: error: ‘dynamic_init_dummy_src_2fproto_2fgrpc_2fcore_2fstats_2eproto’ defined but not used [-Werror=unused-variable]
 static bool dynamic_init_dummy_src_2fproto_2fgrpc_2fcore_2fstats_2eproto = []()
             ^
cc1plus: all warnings being treated as errors
Makefile:2924: recipe for target '/home/user/cpp_test/grps/grpc/objs/opt//home/user/cpp_test/august/grpc/gens/src/proto/grpc/core/stats.pb.o' failed
make: *** [/home/user/cpp_test/grps/grpc/objs/opt//home/user/cpp_test/august/grpc/gens/src/proto/grpc/core/stats.pb.o] Error 1 

Because all warnings were treated as errors. And compiling of another libraries was stopped. So I manually added in Makefile in root gRPC directory flag -Wno-unused-variableat the end of 357 line. After adding this flag building of gRPC library went succesfully, and all libgrpc++* and libgrpc* libraries were built.

CPPFLAGS += -g -Wall -Wextra -Werror $(W_NO_UNKNOWN_WARNING_OPTION) -Wno-long-long -Wno-unused-parameter -Wno-deprecated-declarations -Wno-sign-conversion -Wno-shadow -Wno-conversion -Wno-implicit-fallthrough -Wno-sign-compare -Wno-missing-field-initializers -Wno-maybe-uninitialized -DPB_FIELD_32BIT -DOSATOMIC_USE_INLINED=1 -Ithird_party/nanopb -Ithird_party/upb -Isrc/core/ext/upb-generated -Wno-unused-variable

Upvotes: 1

Kevin
Kevin

Reputation: 18243

It looks like you only ran make from the third_party/protobuf directory (which you need to do as the first step), and ran make from the helloworld directory. If you did not do so already, you should run make from the grpc repository root directory, per the documentation. This will ensure the libgrpc++* C++ libraries are built.

Upvotes: 2

Related Questions