Protobuf | 如何在 MAC 上安装 Protobuf 编译 proto 文件

Protobuf | 如何在 MAC 上安装 Protobuf 编译 proto 文件

  • 如果评论区没有及时回复,欢迎来公众号:ByteCode 咨询
  • 公众号:ByteCode。致力于分享最新技术原创文章,涉及 Kotlin、Jetpack、算法、译文、系统源码相关的文章

相关系列:

为什么需要配置 Protobuf 环境

因为 Protobuf 是 Google 开源的跨语言编码协议,所以它使用特殊的语法,需要使用 protoc 命令编译成我们需要的语言,目前 Protobuf 可以编译成 6 中语言,分别是:C++C#DartGoJavaPython

Protobuf 环境搭建

在 MAC 上配置 Protobuf 环境,相比于 ubuntu 和 Gradle 插件的方式,要简单很多,首先执行以下命令下载Protobuf 编译需要的依赖。

brew install automake
brew install libtool
brew install protobuf

下载 protobuf 源码并编译

git@github.com:protocolbuffers/protobuf.git
cd protobuf
./autogen.sh
./configure
make
make install

按照上面所示的命令依次执行完,等待 10 ~ 20 分钟左右,即可安装成功,等待安装完成之后,执行以下命令验证是否安装成功。

protoc --version

如果出现以下信息代表安装成功。

libprotoc 3.12.3

接下来就可以开始编译 proto 文件,请参考文末 常见问题 的解决方案。

编写 proto 文件测试

1. 创建 Person.proto 文件,添加以下内容

syntax = "proto3";

option java_package = "com.hi.dhl.datastore.protobuf";
option java_outer_classname = "PersonProtos";

message Person {
string name = 1;
}
  • syntax :指定 protobuf 的版本,如果没有指定默认使用 proto2,必须是.proto文件的除空行和注释内容之外的第一行
  • option :表示一个可选字段
    • java_package : 指定生成 java 类所在的包名
    • java_outer_classname : 指定生成 java 类的名字
  • message 中包含了一个 string 类型的字段(name)。注意= 号后面都跟着一个字段编号
  • 每个字段由三部分组成:字段类型 + 字段名称 + 字段编号,在 Java 中每个字段会被编译成 Java 对象,其他语言会被编译其他语言类型

2. 执行 protoc 命令

以输出 Java 文件为例,执行以下命令即可输出对应的 Java 文件。

protoc --java_out=./src/main/java -I=./  *.proto
  • --java_out : 指定输出的 Java 文件所在的目录
  • -I :指定 proto 文件所在的目录
  • *.proto : 表示在 -I 指定的目录下查找 以 .proto 文件结尾的文件

常见错误

错误一:Library not loaded

执行 make 命令,如果出现下列错误。

Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib

执行以下命令即可解决。

cd /usr/local/opt/readline/lib
ln -s libreadline.8.0.dylib libreadline.7.dylib

错误二:No syntax specified for the proto file

执行 protoc 命令,编译 proto 文件,出现以下错误。

[libprotobuf WARNING google/protobuf/compiler/parser.cc:648] No syntax specified for the proto file: test.proto. Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)

原因是因为没有指定版本号,在 proto 文件第一行添加以下代码即可解决。

syntax = "proto3"; // 或者 proto2

总结

在 MAC 上配置 Protobuf 环境,相比于 ubuntu 和 Gradle 插件的方式,要简单很多,只要按照命令依次执行,基本上不会太大问题。

如果在安装过程中遇到了任何问题,欢迎在评论区留言,一起来完善这份教程,如果没有及时回复,可以来公众号:ByteCode 咨询。

致力于分享一系列 Android 系统源码、逆向分析、算法、翻译、Jetpack 源码相关的文章,在技术的道路上一起前进

Android10 源码分析

正在写一系列的 Android 10 源码分析的文章,了解系统源码,不仅有助于分析问题,在面试过程中,对我们也是非常有帮助的,如果你同我一样喜欢研究 Android 源码,可以关注我 GitHub 上的 Android10-Source-Analysis

算法题库的归纳和总结

由于 LeetCode 的题库庞大,每个分类都能筛选出数百道题,由于每个人的精力有限,不可能刷完所有题目,因此我按照经典类型题目去分类、和题目的难易程度去排序。

  • 数据结构: 数组、栈、队列、字符串、链表、树……
  • 算法: 查找算法、搜索算法、位运算、排序、数学、……

每道题目都会用 Java 和 kotlin 去实现,并且每道题目都有解题思路,如果你同我一样喜欢算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:Leetcode-Solutions-with-Java-And-Kotlin

精选国外的技术文章

目前正在整理和翻译一系列精选国外的技术文章,不仅仅是翻译,很多优秀的英文技术文章提供了很好思路和方法,每篇文章都会有译者思考部分,对原文的更加深入的解读,可以关注我 GitHub 上的 Technical-Article-Translation

评论