如何编程获取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
相关产品推荐
相关产品推荐

