使用 C++ 和 gRPC 的常见陷阱及解决方案

文章目录

    • 1. 环境配置的陷阱
      • 1.1 依赖版本冲突或混淆
      • 1.2 gRPC 工具缺失
    • 2. 编译和链接的陷阱
      • 2.1 运行时库不匹配(/MT vs /MD)
      • 2.2 未解析的外部符号
    • 3. Protobuf 文件生成的陷阱
      • 3.1 工具版本不匹配
      • 3.2 生成文件运行时库不一致
    • 4. 运行时的陷阱
      • 4.1 缺少 DLL 文件
      • 4.2 服务初始化失败
    • 5. 调试和排查的陷阱
      • 5.1 日志不足
      • 5.2 VS2022 配置复杂
    • 最佳实践总结
    • 结语

gRPC 是一个高性能、跨平台的 RPC 框架,结合 C++ 使用时可以构建高效的服务端和客户端。然而,在实际开发中,从环境配置到编译、链接,再到运行时调试,开发者往往会遇到不少“坑”。本文总结了使用 C++ 和 gRPC 的常见问题,结合 vcpkg、CMake 和 Visual Studio 2022 的实践经验,提供详细的解决方案,帮助开发者少走弯路。

1. 环境配置的陷阱

1.1 依赖版本冲突或混淆

在使用 vcpkg 管理 gRPC 和 Protobuf 等依赖时,可能会同时安装动态库(如 x64 - windows)和静态库(如 x64 - windows - static),导致 CMake 或链接器混淆。

  • 表现
    • 链接错误,比如运行时库不匹配(/MT vs /MD)。
    • CMake 配置时意外使用了错误的三元组(triplet)。
  • 解决方法
    • 明确指定三元组并清理多余版本:
vcpkg remove protobuf:x64 - windows grpc:x64 - windows
vcpkg install protobuf:x64 - windows - static grpc:x64 - windows - static
- 在 CMake 中指定:
cmake .. -DVCPKG_TARGET_TRIPLET=x64 - windows - static -DCMAKE_TOOLCHAIN_FILE=C:\vcpkg\scripts\buildsystems\vcpkg.cmake
  • 建议
    始终检查已安装的依赖:
vcpkg list | findstr "protobuf grpc"

1.2 gRPC 工具缺失

vcpkg 安装的 grpc:x64 - windows - static 有时不提供 grpc_cpp_plugin.exe,这会导致无法生成 gRPC 的 C++ 代码。

  • 表现
    运行 protoc 时提示“找不到插件”或生成失败。
  • 解决方法
    • 手动编译 gRPC 获取插件:
git clone --branch v1.60.0 https://github.com/grpc/grpc
cd grpc
mkdir build && cd build
cmake .. -G "Visual Studio 17 2022" -A x64 -DgRPC_BUILD_GRPC_CPP_PLUGIN=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_CXX_FLAGS="/MT" -DCMAKE_C_FLAGS="/MT" -DCMAKE_TOOLCHAIN_FILE=C:\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64 - windows - static
cmake --build . --config Release --target grpc_cpp_plugin
- 将生成的插件复制到 vcpkg:
copy Release\grpc_cpp_plugin.exe C:\vcpkg\installed\x64 - windows - static\tools\grpc\
  • 建议
    将插件路径加入环境变量,便于复用。

2. 编译和链接的陷阱

2.1 运行时库不匹配(/MT vs /MD)

C++ 项目中运行时库的不一致是常见问题,尤其在使用 gRPC 和 Protobuf 时。

  • 表现
    链接器报错:
error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”
  • 解决方法
    • 统一运行时库:
      • 安装静态版本依赖:
vcpkg install protobuf:x64 - windows - static grpc:x64 - windows - static
    - CMake 配置中强制使用 /MT:
-DCMAKE_CXX_FLAGS="/MT" -DCMAKE_C_FLAGS="/MT"
- 验证:

使用 dumpbin 检查:

dumpbin /directives <obj_file>
  • 建议
    在 CMakeLists.txt 中添加全局检查:
if(MSVC)
  foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE)
    string(REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
  endforeach()
endif()

2.2 未解析的外部符号

链接时可能遇到缺少符号定义,尤其是与 Abseil 或标准库相关。

  • 表现
error LNK2001: 无法解析的外部符号 "std::basic_ostream<char>::write"
  • 解决方法
    • 确保链接所有必要库,例如 Abseil 的 absl_log_internal.lib:
target_link_libraries(<target> PRIVATE absl::log_internal)
- 检查运行时库一致性,混合使用可能导致符号未解析。
  • 建议
    详细检查链接器输入,确保无遗漏。

3. Protobuf 文件生成的陷阱

3.1 工具版本不匹配

使用不匹配的 protoc 和 grpc_cpp_plugin 会导致生成代码不兼容。

  • 表现
    编译时出现未定义行为,或运行时崩溃。
  • 解决方法
    使用 vcpkg 提供的工具:
C:\vcpkg\installed\x64 - windows - static\tools\protobuf\protoc.exe --proto_path=<path> --cpp_out=<path> --grpc_out=<path> --plugin=protoc - gen - grpc=C:\vcpkg\installed\x64 - windows - static\tools\grpc\grpc_cpp_plugin.exe <proto_file>.proto
  • 建议
    将工具版本与库版本对齐,避免手动下载。

3.2 生成文件运行时库不一致

生成的 .pb.cc 文件可能使用了 /MD,与项目配置不符。

  • 表现
    链接错误,如 RuntimeLibrary 不匹配。
  • 解决方法
    使用静态版本的 protoc 和插件重新生成,确保一致性。

4. 运行时的陷阱

4.1 缺少 DLL 文件

意外链接了动态库,可能导致运行时缺少 DLL。

  • 表现
    程序启动失败,提示缺少 MSVCRT.dll。
  • 解决方法
    • 检查依赖:
dumpbin /dependents <your_exe>.exe
- 确保全静态链接。
  • 建议
    优先使用静态构建,避免 DLL 依赖。

4.2 服务初始化失败

gRPC 服务端或客户端未正确初始化。

  • 表现
    FAILED_PRECONDITION 或 UNAVAILABLE 错误。
  • 解决方法
    检查端口和地址配置:
ServerBuilder builder;
builder.AddListeningPort("0.0.0.0:50051", grpc::InsecureServerCredentials());

5. 调试和排查的陷阱

5.1 日志不足

gRPC 默认日志不够详细,难以定位问题。

  • 解决方法
    启用详细日志:
set GRPC_VERBOSITY=DEBUG
set GRPC_TRACE=all
  • 建议
    在开发阶段保持日志开启。

5.2 VS2022 配置复杂

手动配置路径容易出错。

  • 解决方法
    使用 vcpkg 集成:
vcpkg integrate install

最佳实践总结

  • 统一静态链接:推荐使用 x64 - windows - static 三元组,避免 DLL 依赖。
  • 版本一致性:确保 protoc、grpc_cpp_plugin 和库版本匹配。
  • 脚本化构建:维护一个 build.bat,记录完整流程,例如:
mkdir build
cd build
cmake .. -G "Visual Studio 17 2022" -A x64 -DCMAKE_TOOLCHAIN_FILE=C:\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64 - windows - static -DCMAKE_CXX_FLAGS="/MT" -DCMAKE_C_FLAGS="/MT"
cmake --build . --config Release
  • 定期更新:保持 vcpkg 和依赖库最新。

结语

使用 C++ 和 gRPC 开发虽然强大,但细节繁多。通过本文总结的陷阱和解决方案,您可以更高效地搭建开发环境、编译项目并调试问题。如果遇到具体错误,欢迎留言,我会提供针对性帮助!希望这篇博客对您的 gRPC 之旅有所助益。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《深度学习实战》第2集:卷积神经网络(CNN)与图像分类

《深度学习实战》第2集&#xff1a;卷积神经网络&#xff08;CNN&#xff09;与图像分类 引言 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是深度学习在计算机视觉领域的核心工具。从早期的 LeNet 到现代的 ResNet 和 Vision Transformer&#xf…

创建Linux虚拟环境并远程连接

目录 下载VMware软件 下载CentOS 创建虚拟环境 远程连接Linux系统 下载VMware软件 不会的可以参考 传送门 下载CentOS 不会的可以参考 传送门 创建虚拟环境 打开VMware软件&#xff0c;创建虚拟机 选择典型安装 找到我们安装好的centOS文件&#xff0c;之后会自动检…

RV1126解码(5) read_vdec_thread线程

read_vdec_thread线程的用处 read_vdec_thread线程主要是获取每一帧VDEC解码数据&#xff0c;并打印出来每一帧数据的具体信息。 代码&#xff1a; //用于从 VDEC 解码器获取每一帧解码后的图像数据 void *read_vdec_thread(void *args) {pthread_detach(pthread_self());MED…

verilog笔记

Verilog学习笔记&#xff08;一&#xff09;入门和基础语法BY电棍233 由于某些不可抗拒的因素和各种的特殊原因&#xff0c;主要是因为我是微电子专业的&#xff0c;我需要去学习一门名为verilog的硬件解释语言&#xff0c;由于我是在某西部地区的神秘大学上学&#xff0c;这所…

Three.js 快速入门教程【六】相机控件 OrbitControls

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…

抗辐照加固CAN FD芯片的商业航天与车规级应用解析

在工业自动化、智能汽车、航空航天及国防装备等关键领域&#xff0c;数据传输的安全性、可靠性与极端环境适应能力是技术升级的核心挑战。国科安芯推出全新一代CANFD&#xff08;Controller Area Network Flexible Data Rate&#xff09;芯片&#xff0c;以高安全、高可靠、断电…

经验分享—WEB渗透测试中遇到加密内容的数据包该如何测试!

经验分享—WEB渗透测试中遇到加密内容的数据包该如何测试&#xff01; 01 加解密的意义 现阶段的渗透测试让我发现越来越多的系统不只是在漏洞修补方面做了功夫&#xff0c;还对一些参数进行加密&#xff0c;干扰爬虫或者渗透测试的进行。 在我小白阶段看到下图这种加密方式…

在群晖上使用Docker安装思源笔记

​​ 最近一段时间&#xff0c;docker的镜像地址都失效了&#xff0c;在群晖系统中&#xff0c;无论是早期版本的docker&#xff0c;还是最新版本中的Container Manager&#xff0c;注册表中都无法链接到docker的镜像&#xff0c;于是&#xff0c;就花了点时间查找资料&#x…

网络安全营运周报

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 第三章网络安全基础 一、网络安全概述 1、网络安全现状及安全挑战 网络安全范畴极其广泛&#xff0c;可以说是涉及多方面。 因为计算机病毒层出不穷以及黑客的…

Linux 进程通信——管道

目录 一、什么是进程通信 二、为什么要进行进程通信 三、如何进行通信 四、管道 1、什么是管道 2、管道的原理 3、接口 4、编码实现 5、管道的特征 6、管道的4种情况 一、什么是进程通信 进程通信是两个或多个进程实现数据层面的交互。 因为进程具有独立性&#xff0…

Linux中DataX使用第四期

简介 紧接着上期关于定义如何一个简单的插件&#xff0c;本期了解下关系型数据库的数据读取和数据写入。 环境 Windows10 (linux中命令相似&#xff0c;为了方面调试就用windows的)JDK(1.8以上&#xff0c;推荐1.8)Python(2或3都可以)Apache Maven (推荐3.x版本)IntelliJ IDEA…

Java计算机毕业设计基于SSM宠物美容信息管理系统数据库源代码+LW文档+开题报告+答辩稿+部署教程+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

核货宝助力连锁门店订货数字化转型升级

在竞争激烈的连锁零售行业&#xff0c;传统订货模式弊端日益凸显&#xff0c;严重制约着企业的发展。核货宝订货系统以其卓越的数字化解决方案&#xff0c;为连锁门店订货带来了全方位的变革&#xff0c;助力企业实现数字化转型升级&#xff0c;在市场中抢占先机。 一、增强总部…

论文解读 | AAAI'25 Cobra:多模态扩展的大型语言模型,以实现高效推理

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 个人信息 作者&#xff1a;赵晗&#xff0c;浙江大学-西湖大学联合培养博士生 内容简介 近年来&#xff0c;在各个领域应用多模态大语言模型&#xff08;MLLMs&…

java中的Entry类,map接口

看Redisson源码时候发现有个Entry&#xff0c;眼熟&#xff0c;遂查资料 Map.Enty<KV> 是在Map接口中的一个内部接口Entry 作用&#xff1a;当Map集合一创建那么就会在Map集合中创建一个Enty对象&#xff0c;用来记录键与值&#xff08;键值对对象&#xff0c;键与值的…

HarmonyOS学习第4天: DevEco Studio初体验

初次邂逅&#xff1a;DevEco Studio 在数字化浪潮汹涌澎湃的当下&#xff0c;移动应用开发领域始终是创新与变革的前沿阵地。鸿蒙系统的横空出世&#xff0c;宛如一颗璀璨新星&#xff0c;照亮了这片充满无限可能的天空&#xff0c;为开发者们开启了一扇通往全新世界的大门。而…

ue5地面上出现preview字样

如图&#xff1a; 解决办法 将光源修改为moveable 参考博客&#xff08;UE光影有preview字样、输出也有_ue5阴影preview消除-CSDN博客

Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)

文章目录 功能包括如何使用 功能包括 红点数据本地持久化 如果子节点有红点&#xff0c;父节点也要显示红点&#xff0c;父节点红点数为子节点红点数的和&#xff1b; 当子节点红点更新时&#xff0c;对应的父节点也要更新&#xff1b; 当所有子节点都没有红点时&#xff0c…

个人环境配置--安装记录

根据显卡下载对应的cuda和cudnn 我使用的是docker,首先拉取镜像,我用的是ubuntu20.04 加速&#xff1a;pull hub.1panel.dev/ devel是开发版本 sudo docker pull hub.1panel.dev/nvidia/cuda:11.6.1-devel-ubuntu20.04先测试一下cuda有没有安装好 nvcc -V更新&#xff0c;安装…

代码审计初探

学会了基础的代码审计后&#xff0c;就该提高一下了&#xff0c;学一下一些框架的php代码审计 先从一些小众的、已知存在漏洞的cms入手 phpems php的一款开源考试系统 源码下载 https://down.chinaz.com/soft/34597.htm 环境部署 windows审计&#xff0c;把相关文件放到phps…