导航:首页 > 源码编译 > protobuf如何静态编译

protobuf如何静态编译

发布时间:2023-03-27 03:00:41

Ⅰ 如何编译protobuf 文件

ProtoBuf java 包编译ProtoBuf的官方下载包并不包含jar文件,需要用户自己configure/make….来自行编译。由于Windows上没有编译环境,就用了一个笨一点方法处理了。
分别下载:
protobuf-2.4.1.zip ProtoBuf的源文件(包含了C++/Java/Python)的源文件
protoc-2.4.1-win32.zip 已经编译过的用于Windows平台的protoc命令(该命令用于将.proto文件转化为Java或C++源文件)。

分别解析这两个文件,你可以在protoc-2.4.1-win32.zip解压后的文件中找到一个protoc.exe文件,将其到protobuf-2.4.1/src目录下,然后进入protobuf-2.4.1/java,执行:
mvn install

Ⅱ protocol buffer怎样编译c++代码

class LogonReqMessage : public ::google::protobuf::MessageLite {
public:
LogonReqMessage();
virtual ~LogonReqMessage();

// implements Message ----------------------------------------------
//下面的成员函数均实现自MessageLite中的虚函数。
//创建一个新的LogonReqMessage对象,等同于clone。
LogonReqMessage* New() const;
//用另外一裂腊个LogonReqMessage对象初始化当前对象,等同于赋值操作符重载(operator=)
void CopyFrom(const LogonReqMessage& from);
//清空当前对象中的所有数据,既将所有成员变量置为未初始化状态。
void Clear();
//判断当前状态是否已经初始化。
bool IsInitialized() const;
//在给当前对象肆厅滑的所有变量赋值之后,获取该对象序列化后所需要的字节数。
int ByteSize() const;
//获取当前对象的类型名称。
::std::string GetTypeName() const;

// required int64 acctID = 1;
//下面的成员函数都是因message中定义的acctID字段而生成伏颂。
//这个静态成员表示AcctID的标签值。命名规则是k + FieldName(驼峰规则) + FieldNumber。
static const int kAcctIDFieldNumber = 1;
//如果acctID字段已经被设置返回true,否则false。
inline bool has_acctid() const;
//执行该函数后has_acctid函数将返回false,而下面的acctid函数则返回acctID的缺省值。
inline void clear_acctid();
//返回acctid字段的当前值,如果没有设置则返回int64类型的缺省值。
inline ::google::protobuf::int64 acctid() const;
//为acctid字段设置新值,调用该函数后has_acctid函数将返回true。
inline void set_acctid(::google::protobuf::int64 value);

// required string passwd = 2;
//下面的成员函数都是因message中定义的passwd字段而生成。这里生成的函数和上面acctid
//生成的那组函数基本相似。因此这里只是列出差异部分。
static const int kPasswdFieldNumber = 2;
inline bool has_passwd() const;
inline void clear_passwd();
inline const ::std::string& passwd() const;
inline void set_passwd(const ::std::string& value);
//对于字符串类型字段设置const char*类型的变量值。
inline void set_passwd(const char* value);
inline void set_passwd(const char* value, size_t size);
//可以通过返回值直接给passwd对象赋值。在调用该函数之后has_passwd将返回true。
inline ::std::string* mutable_passwd();
//释放当前对象对passwd字段的所有权,同时返回passwd字段对象指针。调用此函数之后,passwd字段对象
//的所有权将移交给调用者。此后再调用has_passwd函数时将返回false。
inline ::std::string* release_passwd();
private:
... ...
};

Ⅲ 在win下怎么编译Protobuf

protobuf 是google的一个开源项目,其源代码在github上可以下载到,并且源码都采用cmake来构建,所以我们可以把源码下载到段含盯本地,然后了利用cmake构建本握和地老宴工程,然后编译.

Ⅳ 在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 目录下

Ⅳ 使用-fPIC选项编译出protobuf静态库libprotobuf.a

用的64位Ubuntu系统,开发一个共享库so使用到了protobuf,如果链接libprotobuf.so就需要一起打包带走,否则可能因protobuf版轮顷丛本较多腊樱出现版本不匹配的问题,所以需要它链接静态库libprotobuf.a,但是链乎携接时候报错: relocation R_X86_64_32 against `a local symbol’ can not be used when making a shared object; recompile with -fPIC。

Ⅵ 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 格式的数据~

Ⅶ 如何在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工程重来都没镇迅有成功编译通过过。淡定先,这个不会影响大局的。

Ⅷ OpenCV静态库编译与链接

以OpenCV-4.0.0为例说明在Ubuntu环境下的静态库编译与链接方法:

opencv依赖第三方的库,所以当把opencv编译成静态库的时候,注意要把它运行时必要的依赖库也编译进来,opencv源码内有自己的3rdparty,主要有:libjpeg、libpng、libtiff、libzlib、libwebp、libprotobuf、ffmpeg(用到video时编译)、libgtk(用于显示界面显示,服务器部署不会用到),可以通过cmake -LA来查看配置的编译信息,再根据信息考虑把opencv的哪些mole编译进来。

链接时指定opencv的静态库以及依赖的库。另外需要注意头文件的问题,通过CMakeLists把opencv加入项目编译时,由于opencv编译完成后要install才会把所用的头文件集中拷贝到一个地方,所以事先将头文件拷贝到了项目的opencv目录下。

Ⅸ protobuf c++代码怎么编译

步骤一:部署protoc.exe 1)sudo su ---进入管理模式 //以下操作切换至protobuf文件夹下 2)./configure 3)make 4)make check 5)make install 此时可以查看protobuf文件夹下面的makefile文件,可以查看-build表示的本机环境以及-host表示的编译...

Ⅹ java序列化Protostuff和Serializable的区别

序列化就是将Java Object转成byte[];反序列化就是将byte[]转成Java Object。
Java自带序列化机制java.io.Serializable
标识一个对象需要系列化,该对象类型需要实现 Serializable 接口。
1,序列化的类型和反序列化的类型的序列化ID必须一致(远程信息交换时)。
2,静态数据不会被序列化,Transient关键字修饰的字段不会被序列化。
3,对象序列化存储时,两次存储相同值对象会有优化(第二次对象写入会只存储引用)。
Protostuff是一个序列化库,支持一下序列化格式:
protobuf
protostuff (native)
graph (protostuff with support for cyclic references. See Serializing Object Graphs)
json
smile (binary json useable from the protostuff-json mole)
xml
yaml (serialization only)
kvp (binary uwsgi header)
序列化
@SuppressWarnings("unchecked")
public static <T> byte[] serialize(T obj) {
Class<T> cls = (Class<T>) obj.getClass();//获得对象的类;
LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);//使用LinkedBuffer分配一块默认大小的buffer空间;
try {
Schema<T> schema = getSchema(cls);//通过对象的类构建对应的schema;
return ProtostuffIOUtil.toByteArray(obj, schema, buffer);//使用给定的schema将对象序列化为一个byte数组,并返回。
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
} finally {
buffer.clear();
}
}
反序列化
public static <T> T deserialize(byte[] data, Class<T> cls) {
try {
T message = objenesis.newInstance(cls);//使用objenesis实例化一个类的对象;
Schema<T> schema = getSchema(cls);//通过对象的类构建对应的schema;
ProtostuffIOUtil.mergeFrom(data, message, schema);//使用给定的schema将byte数组和对象合并,并返回。
return message;
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
优缺点比较:
优点 缺点
Serializable 使用方便,可序列化所有类 速度慢,占空间
Protostuff 速度快,基于protobuf 需静态编译

阅读全文

与protobuf如何静态编译相关的资料

热点内容
程序员那么可爱歌曲完整版 浏览:904
为什么购买pdf 浏览:43
操作系统代码编译 浏览:483
程序员东北大学 浏览:426
编译忽略空字符 浏览:117
多店铺阿里云服务器教程 浏览:378
单片机求初值 浏览:420
安卓机如何在电脑备份图片 浏览:925
ca证书加密机价格 浏览:798
天干地支年份算法 浏览:796
程序员打造的视频 浏览:7
java和php通信 浏览:680
为什么黑程序员 浏览:163
程序员男生 浏览:456
戴尔文件夹内文件怎么置顶 浏览:582
云服务器6m网速 浏览:722
vivo手机中国联通服务器地址 浏览:862
工程总控编译失败 浏览:707
燕赵红枫app如何下载 浏览:867
php查杀软件 浏览:878