You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编程获取gRPC/protobuf版本?C++应用是否有API获取版本或Git提交哈希?

好问题!我来帮你梳理下如何在C++应用里获取gRPC和Protobuf的版本信息,完全不用去解析那些podspec文件:

一、编程方式获取gRPC/Protobuf的版本(官方API/宏)

不管你是用预编译库还是从源码编译,gRPC和Protobuf都提供了直接的宏和函数来获取版本信息,完全不需要解析podspec:

1. Protobuf版本获取

Protobuf在头文件 <google/protobuf/version.h> 里定义了一系列版本相关的宏和函数:

  • 整数形式的版本号:PROTOBUF_VERSION(比如 3024001 对应3.24.1)
  • 拆分的主/次/修订版本宏:PROTOBUF_MAJOR_VERSION、PROTOBUF_MINOR_VERSION、PROTOBUF_MICRO_VERSION
  • 字符串形式的版本:google::protobuf::VersionString() 函数,返回类似 "3.24.1" 的字符串

示例代码:

#include <google/protobuf/version.h>
#include <iostream>

int main() {
    std::cout << "Protobuf version (integer): " << PROTOBUF_VERSION << std::endl;
    std::cout << "Protobuf version (string): " << google::protobuf::VersionString() << std::endl;
    std::cout << "Major: " << PROTOBUF_MAJOR_VERSION 
              << ", Minor: " << PROTOBUF_MINOR_VERSION
              << ", Micro: " << PROTOBUF_MICRO_VERSION << std::endl;
    return 0;
}

2. gRPC版本获取

gRPC的版本信息在头文件 <grpc/grpc_version.h> 里:

  • 整数版本号:GRPC_VERSION
  • 拆分版本宏:GRPC_MAJOR_VERSION、GRPC_MINOR_VERSION、GRPC_PATCH_VERSION
  • 字符串版本:grpc_version_string() 函数,返回类似 "1.59.0" 的字符串
  • 完整版本字符串(包含额外信息):grpc_full_version_string(),可能返回 "1.59.0-dev" 这样的内容

示例代码:

#include <grpc/grpc_version.h>
#include <iostream>

int main() {
    std::cout << "gRPC version (integer): " << GRPC_VERSION << std::endl;
    std::cout << "gRPC version (string): " << grpc_version_string() << std::endl;
    std::cout << "gRPC full version: " << grpc_full_version_string() << std::endl;
    std::cout << "Major: " << GRPC_MAJOR_VERSION 
              << ", Minor: " << GRPC_MINOR_VERSION
              << ", Patch: " << GRPC_PATCH_VERSION << std::endl;
    return 0;
}

二、获取Git提交哈希的方法

关于Git提交哈希,这里需要分情况说明:

1. gRPC的Git提交哈希

如果你是从gRPC的Git仓库源码编译,并且在CMake配置时没有关闭版本生成(默认是开启的),那么gRPC会自动在编译时生成包含Git哈希的宏和函数:

  • 宏定义:GRPC_GIT_COMMIT_HASH,是一个字符串常量,比如 "abc123def..."
  • 函数:grpc_git_commit_hash(),返回该哈希字符串

注意:如果是使用预编译的二进制包(比如通过包管理器安装的gRPC),这个哈希信息可能不存在,因为预编译包通常不会包含Git仓库的元数据。

示例代码:

#include <grpc/grpc_version.h>
#include <iostream>

int main() {
#ifdef GRPC_GIT_COMMIT_HASH
    std::cout << "gRPC Git commit hash: " << GRPC_GIT_COMMIT_HASH << std::endl;
    std::cout << "gRPC Git commit hash (via function): " << grpc_git_commit_hash() << std::endl;
#else
    std::cout << "gRPC Git commit hash not available (probably using prebuilt library)" << std::endl;
#endif
    return 0;
}

2. Protobuf的Git提交哈希

Protobuf官方并没有提供直接的API或宏来获取Git提交哈希。如果需要这个信息,你需要在编译Protobuf源码时手动注入:

  • 可以通过CMake的CMAKE_CXX_FLAGS或自定义宏,把Git哈希传递给编译器,比如在CMakeLists.txt里添加:
    execute_process(
        COMMAND git rev-parse --short HEAD
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
        OUTPUT_VARIABLE PROTOBUF_GIT_HASH
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    add_compile_definitions(PROTOBUF_GIT_HASH="${PROTOBUF_GIT_HASH}")
    
  • 之后在你的C++代码里就可以通过PROTOBUF_GIT_HASH宏来访问这个哈希了。

总结

完全不需要解析podspec文件,gRPC和Protobuf都提供了官方的宏和函数来获取版本信息;Git哈希的话,gRPC在源码编译时会自动生成相关信息,Protobuf则需要手动在编译阶段注入。

内容的提问来源于stack exchange,提问作者Curious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:52:51