Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

How to build QT with GRPC



  • here is my .pro file

    QT += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = basler_opt_3
    TEMPLATE = app
    
    # The following define makes your compiler emit warnings if you use
    # any feature of Qt which has been marked as deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    # You can also make your code fail to compile if you use deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    INCLUDEPATH += /usr/local/lib \
                   /usr/local/bin
    
    #/opt/pylon5/include
    # /usr/local/include/opencv3 \
    LIBS += `pkg-config opencv --libs`
    LIBS += -L/opt/pylon5/lib64 -Wl,-E -lpylonbase -lpylonutility -lGenApi_gcc_v3_1_Basler_pylon -lGCBase_gcc_v3_1_Basler_pylon
    #LIBS += `opt/pylon5/bin/pylon-config --libs`
    LIBS += -L/usr/local/lib -lgrpc++ -lgrpc -lgpr -lz -lprotobuf -lgrpc++_reflection -ldl
     #`pkg-config grpc grpc++ protobuf --libs)`
    CONFIG += console
    QMAKE_CXXFLAGS+= -I/opt/pylon5/include
    #QMAKE_CXXFLAGS+= -I/usr/include/opencv
    
    #$(shell /opt/pylon5/bin/pylon-config --cflags) \
       #              $(shell pkg-config --cflags opencv)
    
    QMAKE_LFLAGS+= $(shell /opt/pylon5/bin/pylon-config --libs-rpath)
    
    SOURCES += \
            main.cpp \
            mainwindow.cpp \
        rs232.cpp \
        optrs232.cpp \
        secdialog.cpp \
        imagethread.cpp \
        settingdialog.cpp \
        helloworld.pb.cc \
        helloworld.grpc.pb.cc \
        grpcserver.cpp \
        grpcthread.cpp
    
    HEADERS += \
            mainwindow.h \
        rs232.h \
        optrs232.h \
        global.h \
        BaslerHeader.h \
        baslercam.h \
        secdialog.h \
        imagethread.h \
        settingdialog.h \
        helloworld.pb.h \
        helloworld.grpc.pb.h \
        grpcserver.h \
        grpcthread.h
    
    
    FORMS += \
            mainwindow.ui \
        secdialog.ui \
        settingdialog.ui
    
    RESOURCES += \
        resource.qrc
    

    Here is the error i am confuse.
    ee5b37f2-c54e-4994-88ef-302e82dbd7d8-image.png !
    Absolutely, I am no idea how to solve this, hope someone can help me.
    Thanks


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    Where does SearchService come from ?

    INCLUDEPATH's content looks wrong as you are passing folders containing dlls and binaries.

    Your LIB content is likely also wrong.

    qmake already provides support for pkg-config. You should check the documentation.

    By the way, a .pro file is not a bash script so your call to pkg-config does not do what your think it does.



  • Thank for your reply.
    However, I do not understand clearly.
    I am working on ubuntu.
    My .proto file is below.
    Therefore, I get four files helloworld.grpc.pb.cc, helloworld.grpc.pb.h, helloworld.pb.cc, and helloworld.pb.h from the .proto file.

    syntax = "proto3";
     
    	message SearchRequest
    	{
    		uint32 ImgRows_req=1;
    		uint32 ImgCols_req =2;
    		bytes ImgData_req=3;
    		uint32 ImgType_req=4;
    		uint32 ImgSize_req=5;
            string Commands=6;
    		string Msg_req=7;
    		uint32 Image_Index=8;
    
    	}
     
    	message SearchResponse
    	{
    		
    		uint32 ImgRows_rsp= 1;
    		uint32 ImgCols_rsp =2;
    		bytes ImgData_rsp=3;
    		uint32 ImgType_rsp=4;
    		uint32 ImgSize_rsp=5;
            string ErrorMsg_rsp=6;
            string Msg_rsp=7;
    		uint32 Threshold_rsp=8;
    
    
    	}
     
    	service SearchService {
      		rpc Search (SearchRequest) returns (SearchResponse);
        }
    
    

    SearchService is come from helloworld.grpc.pb.cc.
    I inlcude helloworld.grpc.pb.h in my grpcserver.h.
    However, error "SearchService has not been declared" is still exist.

    // Generated by the gRPC C++ plugin.
    // If you make any local change, they will be lost.
    // source: helloworld.proto
    
    #include "helloworld.pb.h"
    #include "helloworld.grpc.pb.h"
    
    #include <functional>
    #include <grpcpp/impl/codegen/async_stream.h>
    #include <grpcpp/impl/codegen/async_unary_call.h>
    #include <grpcpp/impl/codegen/channel_interface.h>
    #include <grpcpp/impl/codegen/client_unary_call.h>
    #include <grpcpp/impl/codegen/client_callback.h>
    #include <grpcpp/impl/codegen/method_handler_impl.h>
    #include <grpcpp/impl/codegen/rpc_service_method.h>
    #include <grpcpp/impl/codegen/server_callback.h>
    #include <grpcpp/impl/codegen/service_type.h>
    #include <grpcpp/impl/codegen/sync_stream.h>
    
    static const char* SearchService_method_names[] = {
      "/SearchService/Search",
    };
    
    std::unique_ptr< SearchService::Stub> SearchService::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {
      (void)options;
      std::unique_ptr< SearchService::Stub> stub(new SearchService::Stub(channel));
      return stub;
    }
    
    SearchService::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)
      : channel_(channel), rpcmethod_Search_(SearchService_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
      {}
    
    ::grpc::Status SearchService::Stub::Search(::grpc::ClientContext* context, const ::SearchRequest& request, ::SearchResponse* response) {
      return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_Search_, context, request, response);
    }
    
    void SearchService::Stub::experimental_async::Search(::grpc::ClientContext* context, const ::SearchRequest* request, ::SearchResponse* response, std::function<void(::grpc::Status)> f) {
      ::grpc::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_Search_, context, request, response, std::move(f));
    }
    
    void SearchService::Stub::experimental_async::Search(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::SearchResponse* response, std::function<void(::grpc::Status)> f) {
      ::grpc::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_Search_, context, request, response, std::move(f));
    }
    
    void SearchService::Stub::experimental_async::Search(::grpc::ClientContext* context, const ::SearchRequest* request, ::SearchResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
      ::grpc::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_Search_, context, request, response, reactor);
    }
    
    void SearchService::Stub::experimental_async::Search(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::SearchResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
      ::grpc::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_Search_, context, request, response, reactor);
    }
    
    ::grpc::ClientAsyncResponseReader< ::SearchResponse>* SearchService::Stub::AsyncSearchRaw(::grpc::ClientContext* context, const ::SearchRequest& request, ::grpc::CompletionQueue* cq) {
      return ::grpc::internal::ClientAsyncResponseReaderFactory< ::SearchResponse>::Create(channel_.get(), cq, rpcmethod_Search_, context, request, true);
    }
    
    ::grpc::ClientAsyncResponseReader< ::SearchResponse>* SearchService::Stub::PrepareAsyncSearchRaw(::grpc::ClientContext* context, const ::SearchRequest& request, ::grpc::CompletionQueue* cq) {
      return ::grpc::internal::ClientAsyncResponseReaderFactory< ::SearchResponse>::Create(channel_.get(), cq, rpcmethod_Search_, context, request, false);
    }
    
    SearchService::Service::Service() {
      AddMethod(new ::grpc::internal::RpcServiceMethod(
          SearchService_method_names[0],
          ::grpc::internal::RpcMethod::NORMAL_RPC,
          new ::grpc::internal::RpcMethodHandler< SearchService::Service, ::SearchRequest, ::SearchResponse>(
              std::mem_fn(&SearchService::Service::Search), this)));
    }
    
    SearchService::Service::~Service() {
    }
    
    ::grpc::Status SearchService::Service::Search(::grpc::ServerContext* context, const ::SearchRequest* request, ::SearchResponse* response) {
      (void) context;
      (void) request;
      (void) response;
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    
    

    INCLUDEPATH is where the header files are. like. grpc pylon
    And LIBS is where the .so files are. like the grpc .so -L/usr/local/lib -lgrpc++ -lgrpc -lgpr -lz -lprotobuf -lgrpc++_reflection -ldl
    Did I miss anything?
    I appreciate your kind assistance.


  • Lifetime Qt Champion

    What version of protoc are you using ?



  • Hi, this https://github.com/semlanik/qtprotobuf might be useful for you


Log in to reply