GRPC C++ windows下的简易安装方法

news2024/9/30 11:27:47

最近因为想给Llama.cpp加一个grpc入口,折腾了一圈GRPC运行时的安装,起初参考GRPC官方的Build from source,未果。

主要原因是基于cmake的安装和调用遭遇到几次大的问题。

一是vscode编译器集成的问题,二是cmake的find_package的查找路径问题等,最终没有成功,后来进一步搜索,找到一个很简单的方法:

使用vcpkg安装

vcpkg是微软官方出的包管理器,可以配合cmake来使用

microsoft/vcpkg: C++ Library Manager for Windows, Linux, and MacOS (github.com)icon-default.png?t=N4P3https://github.com/microsoft/vcpkg首先我们需要完成安装(建议阅读官方中文指引),在完成基础软件包下载之后,依次执行以下操作

git clone https://github.com/microsoft/vcpkg
.\vcpkg\bootstrap-vcpkg.bat

就可以完成下载和安装。最好选一个空间比较大的磁盘来执行这个命令,因为这个目录也会作为vcpkg下载的各个包的安装路径。

执行完之后,把.\vcpkg加入环境变量里的PATH里,下一次就可以直接执行了。

使用vcpkg安装grpc

安装grpc

vcpkg install grpc:x64-windows

最新版本是默认x64了,也可以直接输入

vcpkg install grpc

这个默认设置似乎是最近才改的,我看网上很多材料是要加x64-windows后缀的,大家可以注意以下安装过程中的提示。

安装protobuf

vcpkg install protobuf protobuf:x64-windows

在cpp项目中使用安装包

安装完之后,如果想在cmake项目中直接通过find_package找到这个包,需要有两个工作要做。

执行以下操作

vcpkg integrate install

执行之后,会有提示出现

Applied user-wide integration for this vcpkg root.
CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=E:/xxx/vcpkg.cmake"

All MSBuild C++ projects can now #include any installed libraries. Linking will be handled automatically. Installing new libraries will make them instantly available.

绿色部分是我们执行cmake构建的时候需要附加的参数,例如我运行llama会需要做

cmake .. -DCMAKE_TOOLCHAIN_FILE=E:/xxx/vcpkg.cmake

构建完成之后的编译阶段就和原始的一样了。

引用相关头文件

grpc的cmakefile里主要要包含以下部分,这是我为llama.cpp加的grpc-server的cmakefile

# 生成文件的名称
set(TARGET grpc-server)

# 引入包
find_package(Protobuf CONFIG REQUIRED)
find_package(gRPC CONFIG REQUIRED)

# 引入protoc和grpc_cpp_plugin程序,在编译proto文件的阶段需要使用
find_program(_PROTOBUF_PROTOC protoc)
find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)

# 引入必要的头文件搜索路径
# 生成路径,因为proto编译后的c和h文件在这个目录,所以必须包含
include_directories(${CMAKE_CURRENT_BINARY_DIR})
# protobuf头文件路径
include_directories(${Protobuf_INCLUDE_DIRS})

message(STATUS "Using protobuf ${Protobuf_VERSION} ${Protobuf_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR}")


# 寻找proto文件,按你的文件名称修改
get_filename_component(hw_proto "./message.proto" ABSOLUTE)
# 寻找路径
get_filename_component(hw_proto_path "${hw_proto}" PATH)

# Generated sources
set(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/message.pb.cc")
set(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/message.pb.h")
set(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/message.grpc.pb.cc")
set(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/message.grpc.pb.h")

# 编译proto得到h和c文件
add_custom_command(
      OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" "${hw_grpc_hdrs}"
      COMMAND ${_PROTOBUF_PROTOC}
      ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"
        --cpp_out "${CMAKE_CURRENT_BINARY_DIR}"
        -I "${hw_proto_path}"
        --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
        "${hw_proto}"
      DEPENDS "${hw_proto}")

# 添加生成的文件,作为类库
add_library(hw_grpc_proto
  ${hw_grpc_srcs}
  ${hw_grpc_hdrs}
  ${hw_proto_srcs}
  ${hw_proto_hdrs})

add_executable(${TARGET} grpc-server.cpp)
target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT} hw_grpc_proto absl::flags
  absl::flags_parse
  gRPC::grpc++_reflection
  gRPC::grpc++
  protobuf::libprotobuf)
target_compile_features(${TARGET} PRIVATE cxx_std_11)
if(TARGET BUILD_INFO)
  add_dependencies(${TARGET} BUILD_INFO)
endif()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/585700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门--初步认识类和对象

0.前言 前面几章,我们一起学习了C和C语言的不同之处,已经算是半只脚迈入了C的“门槛”,本章让我们继续学习C的类和对象。 1.面向对过程和面向对象的初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤&…

【网络协议详解】——电子邮件系统协议(学习笔记)

目录 🕒 1. 电子邮件系统概述🕒 2. 简单邮件传送协议SMTP🕒 3. SMTP协议的命令和响应🕘 3.1 命令🕤 3.1.1 HELO🕤 3.1.2 MAIL FROM🕤 3.1.3 RCPT TO🕤 3.1.4 DATA🕤 3.1.…

【软件设计与体系结构】 软件体系结构风格

软件体系结构(Software Architecture) 软件体系结构(Software Architecture)包括构成系统的设计元素的描述、 设计元素 之间的交互、 设计元素的组合模式以及在这些模式中的约束。 定义 软件体系结构表示系统的框架结构&#xf…

IIC接口

一、IIC总线简介 IIC总线是由飞利浦公司推出的一种串行、同步、半双工通信协议。它由两条线组成,时钟线(SCL)和数据线(SDA)。主机产生通信用的时钟,可以产生起始信号和结束信号来开始或者结束一次通信。 …

OFGF光流引导特征:用于视频动作识别的快速且稳健的运动表示【含源码】

论文地址:https://openaccess.thecvf.com/content_cvpr_2018/papers/Sun_Optical_Flow_Guided_CVPR_2018_paper.pdf 这个 repo 包含论文的实现代码: Optical Flow Guided Feature: A Fast and Robust Motion Representation for Video Action Recognition,Shuyang Sun,Zh…

基于MATLAB的数字滤波器语音信号去噪

文章目录 一、滤波器的种类及简介二、设计流程三、滤波器设计实现与结果仿真参考文献基于MATLAB的FPR滤波器设计源代码 本课程设计通过分析FIR滤波器的基本原理,在MATLAB环境下利用窗函数法设计出FIR滤波器,实现FIR滤波器的仿真。首先是采集一段语音信号&#xff0c…

C++高级数据结构——ST表(倍增表)

从上次写文章到现在已经27天了,将近一个月蒟蒻没有更新了。 最近学的ST表太难理解了,再加上忙,一直没时间…… ----------------------------------------------------------------------------------------------------------------------…

Tarball管理

文章目录 Tarball管理Tarball安装的基本步骤一般 Tarball 软件安装的建议事项 Tarball管理 从源代码的说明我们知道制作一个二进制程序需要很多东西,这包括下面这些基础的软件。 gcc或cc等C语言编译器make及autoconfig等软件需要内核提供的Library以及相关的inclu…

win11使用命令行建立wifi热点,并可以设定名称密码等

主要是想自动化的实现打开wifi热点,ssid和wifi密码可控!手机设定比较简单,但是用程序行来设定还真是比较麻烦。 查了一下,有人使用netsh 无法解决,也就是说无法使用如下命令启动移动热点: netsh wlan set hostednetwork mode=allow ssid=wifi888 key=88888888 netsh wl…

信息安全实践1.2(重放攻击)

前言 这个实验是看一本书做的,就是李华峰老师的书——《Metasploit Web 渗透测试实战》,我之前写过一篇Slowloris DoS攻击的博客,也是看这本书写的,总的来说,有用处。这篇博客其实也只是很浅显的去做一下重放攻击。 要…

PyTorch 深度学习 || 专题二:PyTorch 编程基础

PyTorch 编程基础 文章目录 PyTorch 编程基础1. backword 求梯度2. 常用损失函数2.1 均方误差损失函数2.2 L1范数误差损失函数2.3 交叉熵损失函数 3. 优化器 1. backword 求梯度 import torchw torch.tensor([1.], requires_gradTrue) x torch.tensor([2.], requires_gradTr…

R实践——【rgplates】安装、介绍、入门

【rgplates】安装、介绍、入门 1. rgplates 安装1.1 easy way1.2 备案方法 2. rgplates 介绍3. rgplates 在线方法入门3.1 加载rgplates3.2 板块重建3.3 独立的地点坐标3.3.1 单个现存坐标点3.3.2 单个点的古坐标3.3.3 多个点的古坐标 3.4 现今的海岸线3.5 其他的重建模型3.6 在…

JMeter 性能测试基本过程及示例

jmeter 为性能测试提供了一下特色: 2023年最新出炉性能测试教程,真实企业性能压测全流程项目实战训练大合集!_哔哩哔哩_bilibili2023年最新出炉性能测试教程,真实企业性能压测全流程项目实战训练大合集!共计11条视频&…

javascript获取对象的键名列表、键值列表

Object.keys&#xff1a;获取对象的键名列表 Object.values&#xff1a;获取对象的键值列表 <script>var obj {name: 1,age: 2,order: 3}const klist Object.keys(obj)const vals Object.values(obj)console.log(obj, obj)console.log(键名列表, klist)console.log(键…

STM32F4_位带操作

目录 1. 位带简介 2. 别名区地址的计算 2.1 合并计算 3. 位带操作访问ODR和IDR寄存器 4. GPIOB->MODER&~(3<<(9*2));GPIOB->MODER|0<<9*2 / GPIOB->MODER&~(3<<(9*2));GPIOB->MODER|1<<9*2 位带操作在写单片机程序时&#xf…

springboot+vue 刘老师

课程内容 前端&#xff1a;vue elementui 后端&#xff1a;springboot mybatisplus 公共云部署 ------boot-------- 热部署 不用devtools&#xff0c;交给jrebel工具 RequestMapping ​ 参数 value 路径 method 方法consumes 请求媒体类型 如 application/jsonproduces …

DJ5-7 缓冲区管理

目录 5.7.1 缓冲的引入 5.7.2 单缓冲和双缓冲 1、单缓冲&#xff08;Single Buffer&#xff09; 2、双缓冲&#xff08;Double Buffer&#xff09; 3、双机通信时缓冲区的设置 5.7.3 循环缓冲 1、循环缓冲的组成 2、循环缓冲区的使用 3、进程同步 5.7.4 缓冲池 …

Spring Security源码剖析从入门到精通.跟学尚硅谷

1.1 概要 Spring 是非常流行和成功的 Java 应用开发框架&#xff0c;Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。 正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”…

Mediapipe人体识别库

一、简介 官网&#xff1a;MediaPipe | Google for Developershttps://developers.google.cn/mediapipe Mediapipe 是2012年起开始公司内部使用&#xff0c;2019年google的一个开源项目&#xff0c;可以提供开源的、跨平台的常用机器学习(machine learning)方案。Mediapipe…

python-sqlite3使用指南

python下sqlite3使用指南 文章目录 python下sqlite3使用指南开发环境sqlite3常用APICRUD实例参考 开发环境 vscode ​ 开发语言&#xff1a; python vscode SQLite插件使用方法&#xff1a; 之后在这里就可以发现可视化数据&#xff1a; sqlite3常用API Python 2.5.x 以上…