linux grpc,grpc linux下的编译使用-Go语言中文社区

2023-11-18

1. 一些工具安装

$ apt-get install build-essential autoconf libtool pkg-config

$ apt-get install libgflags-dev libgtest-dev

$ apt-get install clang libc++-dev

2. 源码下载

$ git clone -b v1.15.0 https://github.com/grpc/grpc

$ cd grpc

$ git submodule update --init

3. 编译

编译的话,直接进入grpc根目录,然后在控制台make即可

$ make

笔者编译的时候,遇到的一些问题

编译protobuf的时候失败, 提示

config.status: error: cannot find input file: `Makefile.in'

这个时候,进入protobuf源码文件, 运行autogen.sh脚本,然后再返回到grpc源码根目录,继续编译即可

$ cd ./third_party/protobuf

$ ./autogen.sh

没有自动编译zlib库

编译grpc库的时候,并没有自动编译zlib库,所有需要自己手动去编译下

$ cd ./third_party/zlib

$ mdkir .build

$ cd .build

$ cmake ..

$ make

4. 使用

第一次测试使用的话,可以使用example里面的helloworld

先根据helloworld.proto生成pb和grpc.pb文件$ protoc.exe -I=. --grpc_out=../pb_gen --plugin=protoc-gen-grpc=../../.../../YDK/3rd/grpc-1.15.0/bin/linux/grpc_cpp_plugin helloworld.proto

$ protoc.exe -I=. --cpp_out=../pb_gen helloworld.proto

protoc-gen-grpc 后面跟的是grpc_cpp_plugin二进制路径, 然后在pb_gen文件夹会生成4个文件

helloworld.grpc.pb.h

helloworld.grpc.pb.cc

helloworld.pb.cc

helloworld.pb.h

CMakelist.txt

代码路径

grpc_test

|----bin

|----pb_gen

|----helloworld.grpc.pb.cc

|----helloworld.grpc.pb.h

|----helloworld.pb.cc

|----helloworld.pb.h

|----src

|----client

|-----greeter_client.cc

|----server

|-----greeter_server.cc

|----projects

|----cmake

|----CMakeLists.txt

CMakelist.txt

cmake_minimum_required(VERSION 2.6)

project(grpc_test)

#add_compile_options(-std=c++11)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -march=native -O3 -pthread")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ../../../bin/)

# client

set(CLI_HEADER_SRCS

../../pb_gen/helloworld.grpc.pb.h

../../pb_gen/helloworld.pb.h

)

set(CLI_CPP_SRCS

../../pb_gen/helloworld.grpc.pb.cc

../../pb_gen/helloworld.pb.cc

../../src/client/greeter_client.cc

)

include_directories(

../../src

../../pb_gen

../../../../../YDK/3rd/protobuf-3.5.1/include

../../../../../YDK/3rd/grpc-1.15.0/include

../../../../../YDK/

)

add_executable(grpc_test_client ${CLI_HEADER_SRCS} ${CLI_CPP_SRCS})

FIND_LIBRARY(PB_LIB protobuf ../../../../../YDK/3rd/protobuf-3.5.1/lib/linux)

message(STATUS "protobuf lib path:" ${PB_LIB})

if(NOT PB_LIB)

message(FATAL_ERROR "not find the protobuf lib" )

endif(NOT PB_LIB)

FIND_LIBRARY(ADDR_SORT_LIB address_sorting ../../../../../YDK/3rd/grpc-1.15.0/lib/linux)

message(STATUS "address_sorting lib path:" ${ADDR_SORT_LIB})

if(NOT ADDR_SORT_LIB)

message(FATAL_ERROR "not find the address_sorting lib" )

endif(NOT ADDR_SORT_LIB)

FIND_LIBRARY(ARES_LIB ares ../../../../../YDK/3rd/grpc-1.15.0/lib/linux)

message(STATUS "ares lib path:" ${ARES_LIB})

if(NOT ARES_LIB)

message(FATAL_ERROR "not find the ares lib" )

endif(NOT ARES_LIB)

FIND_LIBRARY(BSSL_LIB boringssl ../../../../../YDK/3rd/grpc-1.15.0/lib/linux)

message(STATUS "boringssl lib path:" ${BSSL_LIB})

if(NOT BSSL_LIB)

message(FATAL_ERROR "not find the boringssl lib" )

endif(NOT BSSL_LIB)

FIND_LIBRARY(GPR_LIB gpr ../../../../../YDK/3rd/grpc-1.15.0/lib/linux)

message(STATUS "gpr lib path:" ${GPR_LIB})

if(NOT GPR_LIB)

message(FATAL_ERROR "not find the gpr lib" )

endif(NOT GPR_LIB)

FIND_LIBRARY(GRPC_LIB grpc ../../../../../YDK/3rd/grpc-1.15.0/lib/linux)

message(STATUS "grpc lib path:" ${GRPC_LIB})

if(NOT GRPC_LIB)

message(FATAL_ERROR "not find the grpc lib" )

endif(NOT GRPC_LIB)

FIND_LIBRARY(GRPCPP_LIB grpc++ ../../../../../YDK/3rd/grpc-1.15.0/lib/linux)

message(STATUS "grpc++ lib path:" ${GRPCPP_LIB})

if(NOT GRPCPP_LIB)

message(FATAL_ERROR "not find the grpc++ lib" )

endif(NOT GRPCPP_LIB)

FIND_LIBRARY(ZLIB_LIB z ../../../../../YDK/3rd/grpc-1.15.0/lib/linux)

message(STATUS "zlib lib path:" ${ZLIB_LIB})

if(NOT ZLIB_LIB)

message(FATAL_ERROR "not find the zlib lib" )

endif(NOT ZLIB_LIB)

target_link_libraries(grpc_test_client ${PB_LIB} ${GRPCPP_LIB}

${GRPC_LIB} ${GPR_LIB} ${BSSL_LIB} ${ARES_LIB} ${ADDR_SORT_LIB} ${ZLIB_LIB})

# server

set(SRV_HEADER_SRCS

../../pb_gen/helloworld.grpc.pb.h

../../pb_gen/helloworld.pb.h

)

set(SRV_CPP_SRCS

../../pb_gen/helloworld.grpc.pb.cc

../../pb_gen/helloworld.pb.cc

../../src/server/greeter_server.cc

)

include_directories(

../../src

../../pb_gen

../../../../../YDK/3rd/protobuf-3.5.1/include

../../../../../YDK/3rd/grpc-1.15.0/include

../../../../../YDK/

)

# link dir

# link_directories(../../../../../YDK/3rd/grpc-1.15.0/lib/linux)

add_executable(grpc_test_server ${SRV_HEADER_SRCS} ${SRV_CPP_SRCS})

FIND_LIBRARY(PB_LIB protobuf ../../../../../YDK/3rd/protobuf-3.5.1/lib/linux)

message(STATUS "protobuf lib path:" ${PB_LIB})

if(NOT PB_LIB)

message(FATAL_ERROR "not find the protobuf lib" )

endif(NOT PB_LIB)

target_link_libraries(grpc_test_server ${PB_LIB}

${GRPCPP_LIB} ${GRPC_LIB} ${GPR_LIB} ${BSSL_LIB} ${ARES_LIB} ${ADDR_SORT_LIB} ${ZLIB_LIB})

依赖的库有

libprotobuf.lib

libgrpc++.lib

libgrpc.lib

libgpr.lib

libboringssl.lib

libares.lib

libaddress_sorting.lib

libz.lib

编译$ cd ./projects/cmake

$ mkdir .build

$ cd .build

$ cmake ..

$ make

运行

server

$ ./grpc_test_server

Server listening on 0.0.0.0:50051

client

$ ./grpc_test_client

Greeter received: Hello world

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux grpc,grpc linux下的编译使用-Go语言中文社区 的相关文章

  • C++新特性03_迭代器iterator及类型推导auto(迭代器:用于容器中数据遍历;动态数组(vector)和链表(list)遍历;堆上下限标志位;类型推导auto:编译时自动推导数据类型)

    迭代器iterator及类型推导auto 1 迭代器 用于容器中数据的遍历操作 1 1 普通数组与动态数组定义及遍历方式 1 1 1 数组 普通的数组 一旦申请 不能再扩增 1 1 2 动态数组 vector 不用指定其大小 会根据数组当前
  • mybatis级联查询

    用户表 CREATE TABLE sys user userid varchar 50 NOT NULL roleid int 11 NOT NULL username varchar 50 DEFAULT NULL COMMENT 用户名
  • go语言学习 1 -- 类型

    Go语言接受了函数式编程的一些想法 支持匿名函数与闭包 接受了以Erlang语言为代表的面向消息编程思想 支持goroutine和通道 并推荐使用消息而不是共享内存来进行并发编程 总体来说 Go语言是一个非常现代化的语言 精小但非常强大 学
  • 公司的电脑为什么卡——因为缺少工程师文化

    点击一键订阅 云荐大咖 专栏 获取官方推荐精品内容 学技术不迷路 最近在给一些公司做技术培训时 发现不少公司还面临这些老问题 腰疼的椅子 卡顿的电脑 小尺寸显示器 24 英寸 不能查资料的网络 导致研发效率低下 员工满意度低 离职率高 公司
  • 推荐算法实战项目:用户协同过滤(UserCF)原理以及案例实战(附完整 Python 代码)

    协同过滤 collaborative filtering 是一种在推荐系统中广泛使用的技术 该技术通过分析用户或者事物之间的相似性 来预测用户可能感兴趣的内容并将此内容推荐给用户 这里的相似性可以是人口特征的相似性 也可以是历史浏览内容的相
  • Centos中Docker,docker-compose,jdk8安装

    Centos中Docker docker compose jdk8安装 Date 2018 08 25 使用Docker仓库安装Docker 1 安装所需软件 sudo yum install y yum utils device mapp
  • 5 分钟快速掌握 OKR 管理法 - OKR 实施篇

    上文 5 分钟快速掌握 OKR 管理法 OKR 理论篇 我们讲到 OKR 的价值和意义 这次重点介绍 OKR 如何实施落地 真正为企业发展发挥作用 怎么制定目标 一个合理的目标需要符合三个原则 第一 与战略目标一致 对公司长期发展有价值 第
  • 力扣(LeetCode)2488. 统计中位数为 K 的子数组(C++)

    哈希表 找不到 O n O n O n 思路 试一下等价代换 数组所有数字大小不同 说明数组中最多有一个 k 数组的 k 要包含在 子数组 里 为了便于思考 分析奇数长度的子数组 在子数组里 大于 k 的数 和小于 k 的数 二者数量相等时
  • 深度学习用什么显卡?3060显卡适合深度学习吗?

    都知道深度学习很吃显卡 显存越大 可以缓存的内容就越多 对于非常吃显存的图像类深度学习程序来说 显存太小的显卡批处理就不能调太大 否则会程序会报错 深度学习用什么显卡 3060显卡适合深度学习吗 本文来解答一下这个问题 3060显卡适合深度
  • Spring动态代理用JDK还是用CGLIB?

    切面编程是Spring中非常重要的一个模块 切面编程的实现原理是动态代理 那么动态代理又有两种实现方式 一种方法是直接实现JDK中的InvocationHandler接口 另一种方法是继承CGLIB 那么问题来了 这两种方法有啥区别呢 分别
  • 数据结构——图的DFS(深度优先遍历)- C语言代码实现

    图的深度优先遍历的基本思想 从图中某顶点v出发 1 访问顶点v 2 依次从v的未被访问的邻接点出发 对图进行深度优先遍历 直至图中和v有路径相通的顶点都被访问 3 若此时图中尚有顶点未被访问 则从一个未被访问的顶点出发 重新进行深度优先遍历
  • Javescribt Library Javescript 库 总结

    Yahoo User Interface Library YUI Library YUI is a free open source JavaScript and CSS library for building richly intera
  • JavaScript 刷新或关闭网页时弹窗确认

    beforeunload事件在当页面关闭或刷新时调用 事件触发的时候弹出一个有确定和取消的对话框 确定则离开页面 取消则继续待在本页 有两种方法绑定事件 三种方法实现弹窗 通过 window addEventListener 对 retur
  • 轻量级前端MVVM框架avalon:整体架构

    单看这个图呢 还木有说明 感觉有点蛋疼 作者的将夜 www jiangyea com抽象度太高了 还好在前面已经大概分析过了执行流程 如图 左边是View视图 我们就理解html结构 换句话就是说用户能看到的界面 渲染页面 绑定事件 切换类
  • 【UE4 像素流 WEBUI插件】部署像素流

    目录 一 单实例本地像素流送 步骤 1 勾选插件 2 打包工程并启动信令服务器 3 创建快捷方式并启动游戏 二 单实例局域网像素流送 步骤 1 编辑cirrus js 2 编辑快捷方式属性 3 启动 三 集成WEBUI插件 一 单实例本地像
  • c++深度搜索详解

    1 什么是深度搜索 从计算机科学专业上讲 深度优先搜索算法是最常用图的搜索算法之一 这一算法也是很多重要的图的算法的原型 深度优先搜索其英文全称是Depth First Search 简称DFS 深度搜索的特点是先看 一个方向 例如 骑士在
  • STL deque 源码——deque特点、实现框架、源码分段剖析、常用函数总结(上)

    一 deque的一些特点 支持随机访问 即支持 以及at 但是性能没有vector好 可以在内部进行插入和删除操作 但性能不及list deque 两端 都能够快速插入和删除元素 而vector只能在尾端进行 deque的元素存取和迭代器操
  • 查新报告怎么写?

    一 查新报告怎么写 二 查新报告怎么查 查新报告一般是在查新机构里查 这里给大家推荐一个权威的专业查新机构 掌桥科研 掌桥科研是一家中国的科技信息服务公司 总部位于北京市 公司的主营业务是为中国的科学研究机构 大学 企业等提供科研数据和技术
  • 个人银行管理系统6(C改Java)

    C语言版本 date h ifndef DATE H define DATE H class Date 日期类 private int year 年 int month 月 int day 日 int totalDays 该日期是从公元元年

随机推荐

  • vue项目中跳转到外部链接方法

    div 点我 div goPage url window location href url 直接跳转去外部的a链接
  • 关于Keil中Memory中观察不到数据变化的问题以及启动文件栈的初始化

    关于Keil中Memory中观察不到数据变化的问题 在KEIL中观察Memory数据变化 一定要记得只能在RAM地址或ROM之内观察 如下图所示 RAM的地址设置在地址为0x20000000开始的地方 大小为0x20000 因此只有在这个范
  • gorm+docker+mysql

    简介 ORM Object Relational Mapping 框架采用元数据来描述对象与关系映射的细节 元数据一般采用XML格式 并且存放在专门的对象一映射文件中 简单理解为一种框架的格式 gorm是Golang中一个非常出色的 旨在对
  • 38个MySQL数据库的小技巧

    1 如何快速掌握MySQL 培养兴趣 兴趣是最好的老师 不论学习什么知识 兴趣都可以极大地提高学习效率 当然学习MySQL 5 6也不例外 夯实基础 计算机领域的技术非常强调基础 刚开始学习可能还认识不到这一点 随着技术应用的深 入 只有有
  • java之MySQL数据库

    MySQL数据库 1 什么是数据库 答 数据库是以一定方式存储在一起 能予多个用户共享 具有尽可能小的冗余度 与应用程序彼此独立的数据集合 2 数据库的分类 具体含义 常见的数据库 答 关系型数据库和非关系型数据库 关系数据库 是建立在关系
  • springCloud - 第10篇 - 服务间调用追踪 (zipkin 的使用)

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 一 在微服务系统中 不同应用服务可能会有各种不同的相互调用 springcloud 集成了 zipkin 来实现对于不同服务调用的追踪和统计
  • LIBSVM 使用

    预备 NTU TW Chih Chung Chang and Chih Jen Lin LIBSVM LIBSVM Data Classification Regression and Multi label 正文 a 编译libsvm u
  • 【机器学习】决策树 No.3

    1 决策树之信息论基础 决策树思想来源非常朴素 程序设计中的条件分支结构 if else 最早的决策树就是利用这类结构分割数据的一种分类学习方法 例 银行贷款例子 使用决策树划分是否贷款 此处特征为两个 房子 工作 香农 信息论创始人 19
  • 一文带你了解ES6迭代器(iterator)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 迭代器 iterator 是什么 二 工作原理 总结 一 迭代器 iterator 是什么 迭代器 iterator 是一种接口 为各种不同的数据结构提供统一的
  • SkipList(跳表)

    跳表简介 跳表是基于有序链表实现的搜索结构 是一种动态的搜索结构 即支持动态插入和删除操作 且跳表查找和删除的平均时间复杂度是Olog n 因此跳表是一种时间复杂度相对较小的搜索结构 我们知道对一个数据集合的查找 最差的时间复杂度是O n
  • Switch / Xbox / PS / PSV / PSP 游戏指南

    1 Switch Xbox PS PSV PSP 对比分析 table 1 PSV2000 1000 比较分析 PSV2000 相对 PSV1000 具体变更点 薄了20 轻了15 屏幕改为液晶屏 PS键 开始键和选择键变成球形更方便按 内
  • 2,一个人体姿态识别的项目实现

    学习opencv的例子 1 认识 2 start 直接干货 例子1 例子2 例子3 例子4 例子5 固定阈值 自适应阈值 文档说明 参考链接 http codec wang opencv start 02 basic element ima
  • git仓库创建及上传

    如何创建一个git仓库并上传代码 1 在此之前我们需要安装git和注册gitee账号 1 打开git官网下载安装程序 然后按照指令进行安装即可 2 搜索gitee进行注册和绑定邮箱即可 上传代码时需要登录gitee账号 安装成功之后告诉本地
  • Android apk 反编译解析

    学习android开发 有必要对android的反编译有所了解 当然学习android反编译并不是为了破解别人的软件 完全是一种学习的方法 了解别人写程序的思想是一件很有趣的事情 工具下载地址 http code google com p
  • androidstudio开发!花三分钟看完这篇文章你就懂了!技术详细介绍

    阿里面试 自我介绍 首先要介绍自己的项目经验和个人的擅长点 因为面试官主要考察你的表达能力和语言精简能力 简历的编写其实这里可能需要注意几点 1 标题的直接按照姓名 几年工作经验 应聘岗位格式来填写 例如 黄铭 四年工作经验 Android
  • STP与RSTP区别

    STP 不能快速迁移 即使是在点对点链路或边缘端口 边缘端口指的是该端口直接与用户终端相连 而没有连接到其它设备或共享网段上 也必须等待2 倍的ForwardDelay 的时间延迟 端口才能迁移到转发状态 RSTP Rapid Spanni
  • Python 异步: 异步上下文管理器(17)

    动动发财的小手 点个赞吧 上下文管理器是一种 Python 构造 它提供了一个类似 try finally 的环境 具有一致的接口和方便的语法 例如通过 with 表达 它通常与资源一起使用 确保在我们完成资源后始终关闭或释放资源 无论资源
  • VC++ OpenCV+ZBar二维码识别

    利用OpenCV处理图像的优势 结合ZBar提高二维码识别结果 接口定义 include
  • SpringSecurity配置类--常用配置

    SpringSecurity配置类 在学习这门课的时候 实现各种功能时进行了各种配置 我想将各种配置综合讲述一下 首先自定义配置类 需要继承WebSecurityConfigurerAdapter这个类 在这个类里面做了一些默认配置 Con
  • linux grpc,grpc linux下的编译使用-Go语言中文社区

    1 一些工具安装 apt get install build essential autoconf libtool pkg config apt get install libgflags dev libgtest dev apt get