• 初识google多语言通信框架gRPC系列(四)C++中使用gRPC


    我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example。这样做可以为我们创建自己的项目提供借鉴。如果对gRPC构建应用很熟悉,可以无视本系列文章。

    目录

    一、概述

    二、编译gRPC

    三、C#中使用gRPC

    四、C++中使用gRPC

    上篇介绍了C#调用gRPC,C#项目比较幸运有NuGet帮助配置,C++项目就没有那么幸运了。配置复杂,编译问题也很多。我在这里把我遇到的情况都列出来,使大家在遇到相同的问题时,少走一些弯路。

    1.定义proto

    helloworld.proto文件内容:

    syntax = "proto3";
    
    option java_multiple_files = true;
    option java_package = "io.grpc.examples.helloworld";
    option java_outer_classname = "HelloWorldProto";
    option objc_class_prefix = "HLW";
    
    package helloworld;
    
    // The greeting service definition.
    service Greeter {
      // Sends a greeting
      rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    
    // The request message containing the user's name.
    message HelloRequest {
      string name = 1;
    }
    
    // The response message containing the greetings
    message HelloReply {
      string message = 1;
    }
    

    2. 生成访问代码

    将proto.exe、helloworld.proto、grpc_cpp_plugin.exe拷贝到一个文件夹中,grpc_cpp_plugin.exe是gRPC的protoc插件,生成方法参考我的《编译gRPC》一文。

    创建一个bat文件,包含以下命令:

    protoc.exe -I=. --grpc_out=. --plugin=protoc-gen-grpc=.grpc_cpp_plugin.exe helloworld.proto
    protoc.exe -I=. --cpp_out=. helloworld.proto
    

    生成了两套文件

    hellowworld.pb.h
    hellowworld.pb.cc
    hellowworld.grpc.pb.h
    hellowworld.grpc.pb.cc
    

    其中前两个是protoc生成的,后两个是插件生成的。

    3. 创建C++项目

    4. 设置头文件

    D:XXXXgrpcinclude;
    D:XXXXgrpc	hird_partyprotobufsrc;
    $(ProjectDir)..proto
    

    三个头文件目录,一个是gRPC的头文件,一个是protobuf的头文件,一个是刚生成的的访问类路径。

    5. 设置库

    路径

    D:XXXXgrpc	hird_partyprotobufcmakeRelease;
    D:XXXXgrpcvsprojectsRelease;
    D:XXXXgrpc	hird_partyzlibsolutionRelease;
    D:XXXXgrpcvsprojectspackagesgrpc.dependencies.openssl.1.0.204.1uild
    ativelibv120Win32Releasestatic
    

    四个库文件路径:protobuf库路径、grpc库路径、zlib库路径、openssl库路径。
    没有使用boringssl,openssl的库是从NuGet下载的package中找到的。

    库文件

    libprotobuf.lib;
    grpc.lib;
    gpr.lib;
    grpc++.lib;
    Ws2_32.lib;
    libeay32.lib;
    ssleay32.lib;
    zlibstatic.lib;
    %(AdditionalDependencies)
    

    6. 编译C++项目

    将gRPC的C++ example的代码拷贝到我们刚创建的项目中,编译,出现一些error:

    错误A:

    Error    2    error C1189: #error :      "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"    d:projects_frameworkgrpcincludegrpcimplcodegenport_platform.h    59    1    Server_Cpp
    

    解决:在项目属性中的Preprocessor Definitions中添加_WIN32_WINNT=0x600

    错误B:

    Error    1    error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'    c:program files (x86)microsoft visual studio 12.0vcincludexutility    2132    1    Server_Cpp
    

    解决:在项目属性中的Preprocessor Definitions中添加

    _SCL_SECURE_NO_WARNINGS
    _CRT_SECURE_NO_WARNINGS
    

    错误C:

    error LNK2038: mismatch detected for 'RuntimeLibrary': value
    

    解决:只需要主程序和静态库都采用同一种Runtime Libray编译即可。
    在项目属性C/C++中的Code Generation的Runtime Library选择Multi-threaded(/MT)

    错误D:

    Error    2    error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' in greeter_server.obj    D:Projects_MygRPCgRPC_cppServer_Cpplibprotobuf.lib(generated_message_util.obj)    Server_Cpp
    

    解决:原因是将debug的配置拷贝到release时,将Preprocessor Definitions的_DEBUG也考到release中了,去掉_DEBUG即可

    错误E:

    Error    113    error LNK2001: unresolved external symbol _SSL_state    D:Projects_MygRPCgRPC_cppServer_Cppgrpc.lib(ssl_transport_security.obj)    Server_Cpp
    

    解决:添加openssl的lib(用v120,可能是vs的版本号)

    D:XXXXgrpcvsprojectspackagesgrpc.dependencies.openssl.1.0.204.1uild
    ativelibv120Win32Releasestatic
    

    库文件:

    libeay32.lib
    ssleay32.lib
    

    错误F:

    Error    2    error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)    D:Projects_MygRPCgRPC_cppServer_Cppmsvcrt.lib(ti_inst.obj)    Server_Cpp
    

    解决:
    Project Settings:
    -> Configration Properties -> Linker -> Input -> Ignore Specific Library: LIBCMT.lib

    至此,C++的gRPC项目编译通过。

  • 相关阅读:
    mvc源码解读(2)mvc路由注册
    mvc源码解读(12)mvc四大过滤器之ActionFilter
    asp.net运行机制与页面生命周期
    mvc源码解读(5)Controller工厂的创建
    mvc源码解读(9)ActionDescriptor方法Action的描述对象
    mvc源码解析(7)创建Controller对象
    mvc源码解读(11)mvc四大过滤器之AuthorizationFilter
    mvc源码解读(19)mvc客户端+服务端验证
    get与post
    mvc源码解析(6)获取ControllerType
  • 原文地址:https://www.cnblogs.com/polinzhuo/p/5329199.html
Copyright © 2020-2023  润新知