zoukankan      html  css  js  c++  java
  • windwos grpc 编译

    此文档是windwos grpc c++ 编译 ,基于 vs2015 编译完成

    获取gRPC源码

    gRPC是开源框架,项目代码在github上,所以首先要安装github。
    github安装后,在指定文件夹中,执行Git命令就可以获取gRPC的所有源码。

    git clone https://github.com/grpc/grpc

    虽然在github的gRPC主页上提供了源代码打包下载,但是gRPC的依赖组件就无法自动获取了。

    获取gRPC的依赖组件

    正如所有的项目一样,gRPC也是需要依赖第三方库。由于在gRPC中已经通过git.gitmodules文件定义了依赖组件,所以只需执行git命令就可以自动获取所有的依赖组件。

     cd grpc
    git submodule update --init
     
    (第三方库目录在third_party下面)

    vs工程调试

    用vs2015打开

    vsprojects/grpc.sln

    1,删除工程boringssl

    2,在grpc hird_partyzlibgzguts.h

    中将

    [cpp] view plain copy
     
    1. #ifdef _WIN32  
    2. #  include <stddef.h>  
    3. #endif  

    改成
    [cpp] view plain copy
     
    1. #ifdef _WIN32  
    2. #  include <stddef.h>  
    3. #pragma warning(disable:4996)  
    4. #endif  

    去掉警告。

    完成:可以编译

    说明:NuGet有还原库,需要等待完成

    编译protobuffer

    gRPC依赖protobuffer进行消息编码,因此需要依赖protobuffer。(详细见:grpc hird_partyprotobufcmakeREADME.md)

    需要git,cmake支持

    cmd打开vs命令行工具(Windows Desktop Command Prompts/VS2015 x64 x86 兼容工具命令提示符)

    cd 到grpc目录

    [cpp] view plain copy
     
    1. cd protobuf  
    [cpp] view plain copy
     
    1. git clone -b release-1.7.0 https://github.com/google/googlemock.git gmock  
    [cpp] view plain copy
     
    1. cd gmock  
    [cpp] view plain copy
     
    1. git clone -b release-1.7.0 https://github.com/google/googletest.git gtest  
    [cpp] view plain copy
     
    1. cd ..cmake  
    [cpp] view plain copy
     
    1. mkdir build & cd build  
    [cpp] view plain copy
     
    1. mkdir release & cd release  
    [cpp] view plain copy
     
    1. cmake -G "NMake Makefiles" ^  
    2.      -DCMAKE_BUILD_TYPE=Release ^  
    3.      -DCMAKE_INSTALL_PREFIX=../../../../install ^  
    4.      ../..  
    [cpp] view plain copy
     
    1. cd ..  
    [cpp] view plain copy
     
    1. mkdir debug & cd debug  
    [cpp] view plain copy
     
    1. cmake -G "NMake Makefiles" ^  
    2.      -DCMAKE_BUILD_TYPE=Debug ^  
    3.      -DCMAKE_INSTALL_PREFIX=../../../../install ^  
    4.      ../..  
    [cpp] view plain copy
     
    1. cd ..  
    [cpp] view plain copy
     
    1. mkdir solution & cd solution  
    [cpp] view plain copy
     
    1. cmake -G "Visual Studio 14 2015 Win64" ^  
    2.      -DCMAKE_INSTALL_PREFIX=../../../../install ^  
    3.      ../..  
    打开grpc hird_partyprotobufcmakeuildsolution下protobuf.sln
    编译成功
    生成文件:
    protoc.exe
    libprotobuf.lib
    libprotoc.lib

    后续有用到

    将编译好的Debug,Release文件夹拷贝到grpc hird_partyprotobufcmake目录下(Debug下面的lib文件后边的d需要去掉)

    打开grpcvsprojectsgrpc_protoc_plugins.sln编译生成可执行文件

    完成

    生成文件:

    grpc_cpp_plugin.exe
    grpc_csharp_plugin.exe
    grpc_node_plugin.exe
    grpc_objective_c_plugin.exe
    grpc_python_plugin.exe
    grpc_ruby_plugin.exe

    c++生成helloworld服务器程序

    1.定义proto

    (详细见:grpcexamplesprotoshelloworld.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插件,生成方法参考上文。

    创建一个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生成的,后两个是插件生成的。

    这些包括:

    • 所有的填充,序列化和获取我们请求和响应消息类型的 protocol buffer 代码
    • 名为 Greeter的类,包含
      • 为了客户端去调用定义在 Greeter服务的远程接口类型(或者 存根 )
      • 让服务器去实现的两个抽象接口,同时包括定义在 Greeter中的方法。
    详细见:https://doc.oschina.net/grpc?t=57966

    生成服务器端代码

    3. 创建C++项目

    依照grpcexamplescpphelloworld下client,server例子
    greeter_async_client.cc
    greeter_async_client2.cc
    greeter_async_server.cc
    greeter_client.cc
    greeter_server.cc
     

    4. 设置头文件

    将刚刚生成的文件放入工程源代码目录$(SolutionDir)并包含进工程
    GrpcTestGrpcTestsrcprotobuf
    将:grpcinclude,grpc hird_partyprotobufsrc中的文件拷贝到include目录(自己的库目录)
    三个头文件目录,一个是刚生成的的访问类路径,一个是gRPC的头文件,一个是protobuf的头文件.
     

    5. 设置库

    将:

    grpc hird_partyprotobufcmakeRelease;
    grpcvsprojectsRelease;
    grpc hird_partyzlibsolutionRelease;
    grpcvsprojectspackagesgrpc.dependencies.openssl.1.0.204.1uild ativelibv120Win32Releasestatic

    放入lib目录(自己的lib库目录)

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

    库文件

    libprotobuf.lib;
    grpc.lib;
    gpr.lib;
    grpc++.lib;
    Ws2_32.lib;
    

    6. 编译C++项目

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

    错误A:

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

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

    错误B:

    error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check ****

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

    _SCL_SECURE_NO_WARNINGS
    _CRT_SECURE_NO_WARNINGS

    错误C:

    error LNK2038: mismatch detected for 'RuntimeLibrary': value

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

    OpenSSl我是添加的NuGet库来解决的

    点击项目右键=>管理NuGet程序包

    点击浏览=>输入grpc.dependencies.openssl

    找到grpc.dependencies.openssl =>点击安装(我是用的v1.0.204.1版本)

    完成,

    编辑通过

    c++生成helloworld client程序

     

    依照

    c++生成helloworld服务器程序

    流程,

     
    我使用的
    greeter_client.cc
    greeter_server.cc
    两个测试来做的测试

    说明:

    附上一个编译好的版本,里面带了测试程序(helloworld)

    http://download.csdn.NET/detail/xie1xiao1jun/9630779

    点击打开链接

  • 相关阅读:
    Auto Complete with Redis
    The Secret To 10 Million Concurrent Connections -The Kernel Is The Problem, Not The Solution
    Introducing Resque
    ORACLE定期清理INACTIVE会话
    dba_profiles
    Spring事务配置的五种方式
    Dev GridControl数据导出格式问题
    ConcurrentHashMap Collections.synchronizedMap和Hashtable讨论
    使用SplitContainer控件
    关于jdk配置正确但是tomcat服务器启动时一闪而过的解决办法
  • 原文地址:https://www.cnblogs.com/lidabo/p/7115521.html
Copyright © 2011-2022 走看看