proto文件
下面是一个简单的proto文件。
/*
protoc -I=. --cpp_out=. helloworld.proto
*/
message helloworld
{
required int32 id = 1; // ID
required string str = 2; // str
optional int32 opt = 3; //optional field
}
compile proto file
$ protoc -I=. --cpp_out=. helloworld.proto
protoc: error while loading shared libraries: libprotoc.so.14: cannot open shared object file: No such file or directory
$
libprotoc.so
lib.protoc.so安装在/usr/local/lib目录,而该目录没有加到LD_LIBRARY_PATH中。解决主要步骤:
- 在/etc/ld.so.conf.d/目录下创建一个conf文件;
- 在该文件中增加一行: /usr/local/lib
- sudo ldconfig
过程如下:
$ protoc -I=. --cpp_out=. helloworld.proto
protoc: error while loading shared libraries: libprotoc.so.14: cannot open shared object file: No such file or directory
$ ls /usr/local/lib/
libpcre.a libpcreposix.a libpcre.so.1.2.3 libprotobuf-lite.so.14.0.0 libprotoc.so.14
libpcrecpp.a libpcreposix.la libprotobuf.a libprotobuf.so libprotoc.so.14.0.0
libpcrecpp.la libpcreposix.so libprotobuf.la libprotobuf.so.14 pkgconfig/
libpcrecpp.so libpcreposix.so.0 libprotobuf-lite.a libprotobuf.so.14.0.0 python2.7/
libpcrecpp.so.0 libpcreposix.so.0.0.2 libprotobuf-lite.la libprotoc.a python3.5/
libpcrecpp.so.0.0.0 libpcre.so libprotobuf-lite.so libprotoc.la
libpcre.la libpcre.so.1 libprotobuf-lite.so.14 libprotoc.so
$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
$ ls /etc/ld.so.conf.d/
fakeroot-i386-linux-gnu.conf i386-linux-gnu.conf i386-linux-gnu_EGL.conf i386-linux-gnu_GL.conf libc.conf
$ sudo vi /etc/ld.so.conf.d/protobuf.conf
[sudo] password for flying-bird:
$ cat /etc/ld.so.conf.d/protobuf.conf
/usr/local/lib
$ protoc -I=. --cpp_out=. helloworld.proto
protoc: error while loading shared libraries: libprotoc.so.14: cannot open shared object file: No such file or directory
$ sudo ldconfig
$ protoc -I=. --cpp_out=. helloworld.proto
[libprotobuf WARNING google/protobuf/compiler/parser.cc:546] No syntax specified for the proto file: helloworld.proto. Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)
$
syntax
可以在proto文件开头添加一行,说明语法版本。
/*
protoc -I=. --cpp_out=. helloworld.proto
*/
syntax = "proto2";
message helloworld
{
required int32 id = 1; // ID
required string str = 2; // str
optional int32 opt = 3; //optional field
}
重新编译:
$ protoc -I=. --cpp_out=. helloworld.proto
$ ls -l
total 40
-rw-rw-r-- 1 flying-bird flying-bird 20490 8月 7 23:14 helloworld.pb.cc
-rw-rw-r-- 1 flying-bird flying-bird 10651 8月 7 23:14 helloworld.pb.h
-rw-rw-r-- 1 flying-bird flying-bird 225 8月 7 23:14 helloworld.proto
$
这里是将proto文件生成对应的C++代码。下面的命令是生成Python代码:
$ protoc -I=. --python_out=. helloworld.proto
$ ls -l
total 44
-rw-rw-r-- 1 flying-bird flying-bird 2502 8月 7 23:16 helloworld_pb2.py
-rw-rw-r-- 1 flying-bird flying-bird 20490 8月 7 23:14 helloworld.pb.cc
-rw-rw-r-- 1 flying-bird flying-bird 10651 8月 7 23:14 helloworld.pb.h
-rw-rw-r-- 1 flying-bird flying-bird 225 8月 7 23:14 helloworld.proto
$
可以用protoc –help了解更多信息。