导航:首页 > 源码编译 > 为什么生成protoc项目要重新编译

为什么生成protoc项目要重新编译

发布时间:2023-05-25 11:52:22

A. Protocol Buffers(Objective-C)踩坑指南

这篇文章是讲如何把protobuf文件的编译工作集成到Xcode中,达到在Xcode中就像添加一般的OC文件一样不进行任何多余的尘冲操作直接编译运行.proto文件判兄态的目的。

牛逼,这么智能吗?是的,就是这么智能!

笔者的公司现在所有端都在统一使用一套protobuf数据结构,免除了多端重复定义同一套数据结构的重复工作,效率很高,非常值得推荐。并且Xcode 10进行了一些小优化来增加了对Protobuf的支持,相信不久以后,Xcode对Protobuf的支持将更加智能!

至于什么是 Protobuf 和 Protobuf 语法教程,不是这篇文章的主题,请自行Google。

环境:Xcode 10+
语言:Objective-C

话不多说,正题开始:

首先,真正的企业级项目,并不只是网上很多教程里面演示的一两个 .proto 文件,而是一批 .proto 文件目录的集合,并且是多端共享的。你会发现按照那些教程里面的讲的去做写个demo或许可以,但是真正要达到企业级别的使用的时候,还远远不够,你会遇到各种各样的坑。别问我是怎么知道的,我都是靠自己一个个踩出来的。

首先,要能编译Protobuf文件,我们得安装官方的编译器。你可以选择下面任意一种你喜欢的安装方式:

安装好后,在terminal中输入 which protoc 检测是否安装成功,如安装成功会返回文件路径: /usr/local/bin/protoc

如有问题,请自行google,不在本教程范围内。

没什么好说的,新建一个Xcode工程。使用Cocoapods引入Protobuf的库:

Pod search Protobuf

选择最稳定的版本即可。

这里有两种创建.proto文件的方式:

至于文件内容,如果你熟悉protobuf语法,那随便写几行即可,如果不熟悉,那么可以我的测试内容:

A.proto 文件内容:

B.proto 文件内容:

Xcode 自己并不认识 .proto文件,所以并不会自动编译它们,我们需要把 .proto编译器 自己集成到项目当中,集成的方式如下:

Project --> Build Rules --> 点击+号 ,生成一个特定文件类型编译脚本。

比如:

到此处,我们有几个注意事项:

我们试试把 --proto_path 换成相对路径,看会发生什么,也就是把脚本换成

编译运行,咦~报错了。查看日志,我们可以看到这么一条log信息:

翻译过来就是在--proto_path这个参数中你必须指定.proto源文件的精确路径, protoc 太笨了,它无法搞清楚这个相对路径是不是我们要的绝对路径。google的工程师说这太他么难了。所以这里很明确了, --proto_path 的参数值,只能是proto文件根目录的绝对路径。

我们上面说了,${INPUT_FILE_PATH} 是代表编译输入源文件的绝对路径。

文档里面给的demo是:
protoc --proto_path=src --objc_out=build/gen src/foo.proto src/bar/baz.proto

什么意思呢?

它说,最终掘源编译器会把 src/foo.proto 文件编译成: build/gen/Foo.pbobjc.h 和 build/gen/Foo.pbobjc.m 文件。
而会把 src/bar/baz.proto 文件编译成 build/gen/bar/Baz.pbobjc.h 和 build/gen/bar/Baz.pbobjc.m 。
而不是 build/gen/Baz.pbobjc.h 和 build/gen/Baz.pbobjc.m

也就是说protobuf编译器最终生成的文件会自动按照文件源目录结构存放。

特别强调 并不会 自动创建 build/gen 目录,这个目录需要你提前建好。

并且,查看最终编译生成的.m文件,你会发现一些有趣的事情;比如我在A.proto中引入了B.proto文件,你会看到Protobuf最终编译出来的A.pbobjc.m文件导入文件的格式是包含文件路径的,例如:

我们注意到,上面设置的proto文件的编译输出路径是 $DERIVED_FILE_DIR , 这是为何呢?

答案是为了方便Xcode的集成。

对于自定义的编译脚本,都需要设置一个文件的输出路径.

我们点脚本框下面的Output Files下面的 + 号, 指定文件输出路径。
因为OC文件分为.h和.m文件,所以我们指定2个。

点了之后,你会发现,xcode默认给出的是 $(DERIVED_FILE_DIR)/newOutputFile ,
我们将其改为 $(DERIVED_FILE_DIR)/${INPUT_FILE_BASE}.pbobjc.h 和 $(DERIVED_FILE_DIR)/${INPUT_FILE_BASE}.pbobjc.m ,并且在.m文件的 Compiler Flags 中指定为 -fno-objc-arc 代表该.m文件采用mrc编译。

编译运行,大功告成,是不可能的!!!!

你会发现又报错了:

什么意思呢? 其实就是在 DerivedSources 下找不到 A.pbobjc.m 文件。因为我们指定这个编译的输出路径在这个目录下,所以Xcode在进行OC文件的编译时会去这个目录下找,但是它找不到。为什么找不到呢?我们去这个目录下看,这个目录下确实没有 A.pbobjc.m 这个文件,但是确发现有 a/A.pbobjc.m 。原因我们已经说了,protoc最终的编译文件会自动加上目录前缀。

有人可能会说,能不能把输出文件改成 $(DERIVED_FILE_DIR)/*/${INPUT_FILE_BASE}.pbobjc.h 呢?那我们就来试下。

编译运行

what the hell?

原来,Xcode的Output Files特别蠢,它不支持类似这种通配符写法: $(DERIVED_FILE_DIR)/*/${INPUT_FILE_BASE}.pbobjc.h 。
也不支持传入任何的自定义变量。

只能是明确的文件路径和Xcode自带的环境变量,但是实际项目中,可能不只一层路径,有可能是文件夹下嵌套文件夹。

靠,那这怎么办呢?

实在没办法了,就在打算放弃的时候,咨询了我们的脚本大神,我们尝试了以下在脚本末尾再加了两行:

是不是很机智?

什么意思呢?就是说我们cd到该目录,然后找到该文件对应生成的oc文件,将其一份儿到根目录。怀着求神拜佛的意志,运行了以下,Perfect,终于不再报错了,到目录中查看,也正是我们想要的,所有文件都被出来了。

下一步,就是正常的在项目中import和使用了。

你以为到此就没有坑了吗?到此还有坑。有2点需要注意:

好了,就讲到这里吧,如果觉得文章看得不是很明白,需要一个demo。或者大神有更好的建议,请在评论区留言~

如果文章对你有帮助,请不要吝啬你的点赞哦,你的支持是我分享的动力~

如果大家喜欢,有时间再讲讲怎么改改AFNetworking,能直接请求后端给的 Protobuf 格式的数据~

B. 如何实现protobuf在XCODE上armv7/armv7s/i386的交叉编译

步骤一:部署protoc.exe

1)sudo su ---进入管理模式

//以下操作切换至protobuf文件夹下

2)./configure

3)make

4)make check

5)make install

此时可以查看protobuf文件夹下面的makefile文件,可以查看-build表示的本机环境以及-host表示的编译库的运行环境

我本地的-build=x86_64-apple-darwin12.3.0

-host=x86_64-apple-darwin12.3.0

(这两个参数在后续配置脚本需要用到,与后面脚步的i686-apple-darwin12.3.0以及arm-apple-darwin12.3.0后缀“arm-apple-darwin12.3.0”保持一致)

6)make distclean清理已生成的makefile,为交叉编译配置新makefile做准备

步骤二:配置交叉编译

1)执行脚本ios-build.sh,脚本内容如下:

configure_for_platform() {

export PLATFORM=$1

#export PLATFORM=iPhoneOS

echo "Platform is ${PLATFORM}"

if [ "$PLATFORM" == "iPhoneSimulator" ]; then

export ARCHITECTURE=i386

export ARCH=i686-apple-darwin12.3.0

fi

if [ "$PLATFORM" == "iPhoneOS" ]; then

export ARCHITECTURE=$2

export ARCH=arm-apple-darwin12.3.0

fi

export ARCH_PREFIX=$ARCH-

export SDKVER="6.1"
#sdk版本号必须正确

export
DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer

export SDKROOT="$DEVROOT/SDKs/${PLATFORM}$SDKVER.sdk"

export
PKG_CONFIG_PATH="$SDKROOT/usr/lib/pkgconfig:$DEVROOT/usr/lib/pkgconfig"

export AS="$DEVROOT/usr/bin/as"

export ASCPP="$DEVROOT/usr/bin/as"

export AR="$DEVROOT/usr/bin/ar"

export RANLIB="$DEVROOT/usr/bin/ranlib"

#export CPP="$DEVROOT/usr/bin/c++"

#export CXXCPP="$DEVROOT/usr/bin/c++"

export CC="$DEVROOT/usr/bin/gcc"

export CXX="$DEVROOT/usr/bin/g++"

export LD="$DEVROOT/usr/bin/ld"

export STRIP="$DEVROOT/usr/bin/strip"

export LIBRARY_PATH="$SDKROOT/usr/lib"

export CPPFLAGS=""

#export CFLAGS="-arch armv7 -fmessage-length=0 -pipe -fpascal-strings
-miphoneos-version-min=4.0 -isysroot=$SDKROOT -I$SDKROOT/usr/include
-I$SDKROOT/usr/include/c++/4.2.1/"

export CFLAGS="-arch ${ARCHITECTURE} -fmessage-length=0 -pipe
-fpascal-strings -miphoneos-version-min=4.0 -isysroot=$SDKROOT
-I$SDKROOT/usr/include -I$SDKROOT/usr/include/c++/4.2.1/"

export CXXFLAGS="$CFLAGS"

#export LDFLAGS="-isysroot='$SDKROOT' -L$SDKROOT/usr/lib/system
-L$SDKROOT/usr/lib/"

export LDFLAGS="-arch ${ARCHITECTURE} -isysroot='$SDKROOT'
-L$SDKROOT/usr/lib/system -L$SDKROOT/usr/lib/"

./configure --host=${ARCH} --with-protoc=protoc --enable-static
--disable-shared

}

mkdir ios-build

#build for iPhoneSimulator

configure_for_platform iPhoneSimulator

make clean

make

cp src/.libs/libprotobuf-lite.a ios-build/libprotobuf-lite-i386.a

#提取完整版本(i386)

cp src/.libs/libprotobuf.a ios-build/libprotobuf-i386.a

#build for iPhoneOS armv7

configure_for_platform iPhoneOS armv7

make clean

make

cp src/.libs/libprotobuf-lite.a ios-build/libprotobuf-lite-armv7.a

#提取完整版本(armv7)

cp src/.libs/libprotobuf.a ios-build/libprotobuf-armv7.a

#build for iPhoneOS armv7s

configure_for_platform iPhoneOS armv7s

make clean

make

cp src/.libs/libprotobuf-lite.a ios-build/libprotobuf-lite-armv7s.a

#提取完整版本(armv7s)

cp src/.libs/libprotobuf.a ios-build/libprotobuf-armv7s.a

make clean

#cerate a fat library containing all achitectures in libprotobuf-lite.a

xcrun -sdk iphoneos lipo -arch armv7 ios-build/libprotobuf-lite-armv7.a -arch
armv7s ios-build/libprotobuf-lite-armv7s.a -arch i386
ios-build/libprotobuf-lite-i386.a -create -output
ios-build/libprotobuf-lite.a

#合并三个完整版本(libprotobuf.a)

xcrun -sdk iphoneos lipo -arch armv7 ios-build/libprotobuf-armv7.a -arch
armv7s ios-build/libprotobuf-armv7s.a -arch i386 ios-build/libprotobuf-i386.a
-create -output ios-build/libprotobuf.a

2)将打包生成的libprotobuf-lite.a和libprotobuf.a复制至工程下进行编译,可以编译protobuf在xcode上的模拟器版本和真机版本,完成交叉编译。

C. protobuf-net运行在Unity上,修复IL2CPP反射不兼容问题

Unity开发中,我们可能需要用到 protobuf-net 这个C#实现的ProtoBuff库。

但是, protobuf-net 在IL2CPP下,因为反射的一个梁世不兼容问题,是会运行崩溃的,导致iOS下没法玩。

这时候需要对 protobuf-net 稍作修改,重新编译出DLL才能在Unity下完美运行。橡做肢

这种修改,估计很多遇到同样问题的项目都遇过了。 分享给遇到同样困难的人,希望有帮胡姿助。

详细修改,放到GitHub的一个分支上了。

https://github.com/kingsoft-topgame/protobuf-net/commit/

D. protobuf 怎么在iOS中实用

有两种方式,一是直接使用C++版, 引用.h和dylib就可以了, 用在64位的5s上很容易,但是在5以下的32位上编译环不容易弄对。
二是用objc版的。可以参考如下操作:
1,下载ProtocolBuffer包,并按照包中根目录下README.txt安装。
make install后,会生成编译器protoc,并拷贝到/usr/local/bin目录下。

2,下载芦备Objective-C compiler for ProtocolBuffer。

目前有两种类型的实现。

一个针对ProtocolBuffer2.2做修改,使最后生成的陪氏毁.proto文件编译器(protoc)支持Objective-C类型的文件输出。

另一个针对ProtocolBuffer2.3推出的plugin模式编写插件,以插件方式支持Objective-C类型的文件输出。
我选用第二种方式,这也是Google推荐的方式。
默认会在当前运行目录下创建protobuf-objc目录。进入该目录,并执行:
./autogen.sh
./configure
make
make install
最终生成的插件名字为protoc-gen-objc,会被安装到/usr/local/bin/目录下。
3,测试.proto文件编译。
随便写一个test.proto文件,并编译该文件。命令是:
protoc –objc_out=/Output/Directory/ test.proto
protoc会自动在/usr/local/bin/目录下寻找名为”protoc-gen-objc”的插件,并使用该插件编译.proto文件,最终生成两个文件:
test.pb.h
test.pb.m
这个步骤通过后,说明ProtocoBuffer Compiler for Objective-C可以正常工作了。
4,在Xcode4.3.1中使用ProtocolBuffer
将步骤2中protobuf-obj/src/runtime/Classes目录导入到Xcode项目中,导入时,选中”Copy items into destination group‘s folder(if needed)“。
导入位置选核歼择项目根目录。导入完毕后,项目根目录下将会出现Classes目录。将该目录改名为ProtocolBuffers(注意最后的s):
mv Classes ProtocolBuffers
修改项目属性中”Build Setting——>Header Search Pathes”,将项目根目录“.”添加到头文件搜索路径中去。
这样ProtocolBuffer for Objective-C的工作环境就配置好了。
5,使用将步骤3中编译输出的test.pb.h和test.pb.m添加到项目中,就可以直接使用了

E. gRPC入坑记

概要

由于gRPC主要是谷歌开发的,由于一些已知的原因,gRPC跑demo还是不那么顺利的。单独写这一篇,主要是gRPC安装过程中的坑太多了,记录下来让大家少走弯路。

主要的坑:

本文讲解gRPC demo的同时,会介绍如何解决这些坑。本文对应的Github地址:https://github.com/52fhy/grpc-sample 。该仓库存储了demo示例,以及部分系统编译好的二进制包,大家觉得有些步骤里耗时实在太长了,可以直接clone该仓库,复制二进制包到对应目录(仅限测试开发,生产环境还是老老实实自己编译吧)。

升级GCC

gRPC命令行工具编译需要使用 GCC4.8及以上版本。CentOS6系列的内置版本是GCC4.7。

如果你的系统GCC版本>=4.8,可以忽略本节。如果仅使用golang、java,请忽略本节。

如果需要升级gcc至4.8或更高版本,建议直接采用安装SCL源之后安装devtoolset-6(devtoolset-6目前gcc版本为6.3),因为devtoolset-4及之前的版本都已经结束支持,只能通过其他方法安装。

升级到gcc 6.3:

需要注意的是scl命令启用只是 临时 的,退出shell或重启就会恢复原系统gcc版本。如果要长期使用gcc 6.3的话:

这样退出shell重新打开就是新版的gcc了。其它版本同理。

升级到gcc 7.3:

已经停止支持的devtoolset4(gcc 5.2)及之前版本的安装方法,可能比较慢,大家感兴趣的话可以尝试。

编译gRPC命令行工具

gRPC分C、JAVA、GO、NodeJS版本,C版本包括C++, Python, Ruby, Objective-C, php, C#,这些语言都是基于C版本开发的,共用代码库一个代码库。

如果使用C版本的gRPC,最终要从源码里编译出下列工具:

这些工具作为插件供proto编译器使用。需要先下载 grpc/grpc github上的源码。

这里有2个坑:

1、grpc/grpc仓库比较大,鉴于国内访问的网速,建议使用国内镜像。码云(https://gitee.com)提供了同步更新的镜像地址:

这样下载速度提高了不少。

2、git submole update这个命令实际就是在下载.gitmoles文件里定义的第三方依赖项到third_party目录,这个依赖项有很多,大家可以打开.gitmoles文件查看下详情。依赖的仓库都在github上,下载没几个小时是下载不下来的,就等着慢慢下载吧。

回头想想,我们花费了很多时间,结果只是为了得到grpc的proto编译插件。

PHP相关支持

PHP暂时不支持作为grpc的服务端。作为客户端是可以的,需要机器安装:

其中protoc和protobuf c扩展已经在 Protobuf 小试牛刀 介绍过了,这里不再赘述。上一小节里如果安装成功,那么grpc_php_plugin也是有了的。下面介绍如何安装PHP版的gRPC库。

安装grpc c扩展:

要求:GCC编译器需要4.8及以上版本。可以使用pecl安装:

也可以指定版本:

或者下载源码(http://pecl.php.net/package/grpc)安装:

grpc/grpc代码库里也有PHP扩展的C源码,在grpc/src/php/ext/grpc目录,进去也可以直接编译。

编译完成后在php.ini里添加,使用php --ri grpc可以查看信息。

安装完C扩展后,还需要使用composer安装grpc的库:

gRPC示例

编写gRPC proto

一共定义了三个文件:

其中 User 作为 Model定义,Response 用于 RPC统一返回定义,GreeterService 则是服务接口定义。

限于篇幅,proto文件详见 https://github.com/52fhy/grpc-sample 仓库的proto目录。

GreeterService.proto文件内容如下:

这里面定义了一个service,相当于定义了一个服务接口,我们把方法名、参数定义好了,后面需要去实现它。由于gRPC不支持PHP作为服务端,这里我们使用Golang作为服务端。

首先需要使用proto工具编译出golang的代码:

执行成功,会在 Pb_Go目录里生成Go代码:

如果需要生成PHP客户端的代码,则需要使用grpc php的命令行工具grpc_php_plugin,前面小结如果执行成功,这个工具已经有了。然后:

最终生成的文件:

注意:编译那里如果我们不加--grpc_out=../$out --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin,生成的PHP类是没有GreeterClient的。这个文件是gRPC编译工具自动生成的,用于连接gRPC服务端。

go编写服务

我们用Golang写服务端。上面虽然生成了Golang的部分代码,但真正的服务还没有写呢。

main.go

首先我们新建个main.go,代码不多,我直接贴出来:

然后就可以编译了。

有个大坑:go build main.go的时候会先下载go.mod里定义的依赖(依赖比较多,详情查看:https://github.com/52fhy/grpc-sample/blob/master/go.mod),其中下面这条非常慢,仓库太大了,虽然重定向到github:

为了快速下载,我在码云上做了镜像,地址:gitee.com/52fhy/google-api-go-client 。改了之后下载快多了。

编译成功后,生成了二进制文件main。我们可以直接运行:

go test

为了测试我们写的服务是否正常,可以写测试用例:

test_client.go

运行:

运行有点慢,感觉依赖的库多了。

php客户端

使用gRPC PHP客户端,确保你已经安装了:

示例:

client_test.php

运行后输出:

常见问题

1、CentOS6使用 go mod获取第三方依赖包unknown revision xxx错误

解决:其实go mod调用链中会用到一些git指令,当git版本比较旧时,调用失败产生错误,并给出歧义的提示信息。方法就是升级git版本,CentOS6自带的git是1.7版本。升级完毕后,再尝试go mod。

快速升级方法:

centos6:

2、PHP报错:Fatal error: Class &#' not found

解决:请安装PHP的protobuf c扩展。

3、PHP报错:Fatal error: Class 'GrpcBaseStub' not found

解决:使用composer require grpc/grpc安装grpc。另外对应的grpc C扩展也要安装。

4、下载 github release包很慢怎么办?

解决:下载Mac版 Free Download Manager 下载工具可以解决Github 下载缓慢或失败问题。速度嗖嗖的。

参考

1、为CentOS 6、7升级gcc至4.8、4.9、5.2、6.3、7.3等高版本

http://www.vpser.net/manage/centos-6-upgrade-gcc.html

2、centos 6.x/7.x使用yum升级git版本 - 夜空

https://blog.slogra.com/post-721.html

3、Protobuf 小试牛刀 - 飞鸿影

https://www.cnblogs.com/52fhy/p/11106670.html

(本文完)

F. protoc.exe生成java代码一定要用命令行吗

是的,这个是用命令来执行的,不过你可以把命令写成windows的批处理文件 ,即.bat文件,每次双击即可执行。也可以使用java代码去调用protoc.exe。做成自动化的。

G. protobuf使用出现的问题以及方法

在windows下使用protobuf,编译成dll,在使用中提示下面错误( unresolved external symbol 

?empty_string_once_init_@internal@protobuf@google@@3HA (int google::protobuf::internal::empty_string_once_init_),

?empty_string_@internal@protobuf@google@@3PBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@B (class std::basic_string,class std::allocator> const * const google::protobuf::internal::empty_string_)

提示这两个函差源数,而通过用mpbin 查看libprotobufd.dll,其中导出了这两个函数,最后在这里找到

答案

需要在引用这个dll的工程中加入宏 PROTOBUF_USE_DLLS,通过搜索protobuf工程,发现定义这个宏之后,添加这个宏之后,会有下面的宏定义:

#define LIBPROTOBUF_EXPORT__declspec(dllimport)

有可能在加入pb之后,你的工程出现数百个未定义的类型,而明显在你的项目中,这些都斗庆弊是有定义的,这个时候,你可以考虑把pb消息的头文件添加到其他头文件之前

默认生空族成的xxx.pb.h,xxx.pb.cc的类在windows下都是没有_dllexport符号修饰,所以不可以在生成的dll中导出使用,可以通过 `protoc --cpp_out=dllexport_decl=MY_EXPORT_MACRO:path/to/output/dir myproto.proto`来实现为所有的类添加`MY_EXPORT_MACRO`修饰符。然后在另外一个h文件中定义`MY_EXPORT_MACRO`宏,然后在所有的头文件中包含它

H. Swift 安装protobuf

1、官方项目地址: https://github.com/apple/swift-protobuf

2、拉取项目到本地

3、进入项目本地路径,查看版本

4、根据项目需要,选择版本编译 如:1.5.0

5、构建项目

6、构建完成之后会生成一个 protoc-gen-swift 执行路径:swift-protobuf/.build/release/protoc-gen-swift

7、把protoc-gen-swift文件直接拷贝到/usr/local/bin目录下

8、swift版本的protobuf已安装档伏完成,现在可以来测试使唤册用
准备一个proto文件(Book.proto)

9、生成swift文件和蠢宏

10、把生成的Book.swift文件拖入到项目中就可以使用了

I. 如何在windows下VC++使用protobuf

当前版本为2.3.0,下载两个御裂此压缩包:protoc-2.3.0-win32.zip和protobuf-2.3.0.zip,前者是protobuf的编译器,后者包含了有三程序语言的开发包。
2.解压
首先解压protoc-2.3.0-win32.zip,把protoc.exe文件放到path路径中,最简单的做法就是把这个文件拷贝到C:/WINDOWS目录下。
解压protobuf-2.3.0.zip文件,将文件加压到C盘根目录,主文件位于C:/protobuf-2.3.0/protobuf-2.3.0目录下。

3.安装操作
(1)使用VS2005编译proto,源悔VS工程目录位于vsprojects目录中,工程名字为“protobuf.sln”。

(2)选择“生成”à“生成解决方案”选项进行编译,编译过程中可能会由于编译的顺序报错误,可以使用手工逐个顺序编译生成,可能会比较顺利。按照下图的顺序,右键“重新生成”,逐个编译。但是我在实习操作过程中,libprotobuf-lite工程重来都没镇迅有成功编译通过过。淡定先,这个不会影响大局的。

J. 在windows环境下 编译pb (protobuf) 文件

protoc  --plugin=protoc-gen-go.exe   --go_out= .     xx.proto

protoc  --plugin=protoc-gen-go.exe   --go-grpc_out= .     xx.proto

若提示: --go-grpc_out: protoc-gen-go-grpc: 系统找不到指定的文件。

需在 grpc-go-1.31.0\cmd\protoc-gen-go-grpc 进行编译, go build即可。 把生成的protoc-gen-go-grpc.exe放到你的  GOPATH/bin 目录下

阅读全文

与为什么生成protoc项目要重新编译相关的资料

热点内容
中国移动长沙dns服务器地址 浏览:249
wifi密码加密了怎么破解吗 浏览:596
linux命令cpu使用率 浏览:67
linux实用命令 浏览:238
传奇引擎修改在线时间命令 浏览:109
php取域名中间 浏览:897
cad命令栏太小 浏览:830
php开发环境搭建eclipse 浏览:480
qt文件夹名称大全 浏览:212
金山云服务器架构 浏览:230
安卓系统笔记本怎么切换系统 浏览:618
u盘加密快2个小时还没有搞完 浏览:93
小米有品商家版app叫什么 浏览:94
行命令调用 浏览:436
菜鸟裹裹员用什么app 浏览:273
穷查理宝典pdf下载 浏览:514
csgo您已被禁用此服务器怎么办 浏览:398
打开加密软件的方法 浏览:156
云存储服务器可靠吗 浏览:968
2核1g的云服务器能带动游戏嘛 浏览:900