Ignas
Ignas

Reputation: 379

How to solve compile error in gRPC generated files?

I am creating client-server application, using gRPC. So far I was not using TLS encryption. Now I want to enable it, and strangely I get this error. It seems, at least to me, that this is a linker error. What would be best ways to solve it? CLion doesn't highlight anything, so I assumed everything was syntactically OK, but when compiling I got that error.

/usr/bin/ld: CMakeFiles/projectname.dir/main.cpp.o: in function `grpc::SslServerCredentials(grpc::SslServerCredentialsOptions const&)':
/home/username/projectname/third_party/grpc/include/grpcpp/security/server_credentials.h:60: undefined reference to `grpc_impl::SslServerCredentials(grpc::SslServerCredentialsOptions const&)'
collect2: error: ld returned 1 exit status

This is a makefile that I use to generate C++ code from gRPC specification:

HOST_SYSTEM = $(shell uname | cut -f 1 -d_)
SYSTEM ?= $(HOST_SYSTEM)
CXX = g++
CPPFLAGS += `pkg-config --cflags protobuf grpc`
CXXFLAGS += -std=c++11
ifeq ($(SYSTEM),Darwin)
LDFLAGS += -L/usr/local/lib `pkg-config --libs protobuf grpc++`\
           -lgrpc++_reflection\
           -ldl
else
LDFLAGS += -L/usr/local/lib `pkg-config --libs protobuf grpc++`\
           -Wl,--no-as-needed -lgrpc++_reflection -Wl,--as-needed\
           -ldl
endif
PROTOC = protoc
GRPC_CPP_PLUGIN = grpc_cpp_plugin
GRPC_CPP_PLUGIN_PATH ?= `which $(GRPC_CPP_PLUGIN)`

PROTOS_PATH = ./

vpath %.proto $(PROTOS_PATH)

%.grpc.pb.cc: %.proto
    $(PROTOC) -I $(PROTOS_PATH) --grpc_out=. --plugin=protoc-gen-grpc=$(GRPC_CPP_PLUGIN_PATH) $<

%.pb.cc: %.proto
    $(PROTOC) -I $(PROTOS_PATH) --cpp_out=. $<

clean:
    rm -f *.o *.pb.cc *.pb.h

Upvotes: 2

Views: 2730

Answers (2)

Viresh Fattepur
Viresh Fattepur

Reputation: 11

In CMakeLists.txt under grpc folder, there are many target_link_libraries. which one to edit in order to include the change.

Upvotes: 0

Ignas
Ignas

Reputation: 379

Then problem was solved like this: I had to chage grpc++_unsecure to grpc++ under target_link_libraries in CMakeLists.txt cmake build configuration file. I had forgotten/not thought about this at first.

target_link_libraries(bita_server
        pqxx
        sodium
        protobuf::libprotobuf
#        grpc++_unsecure
        grpc++
        SQLiteCpp
        sqlite3
        pthread
        dl
        ${_PROTOBUF_LIBPROTOBUF}
)

Upvotes: 2

Related Questions