protobuf如何用proto文件导出C++代码文件及链接protobuf静态库问题


【一】.如何用.proto文件导出C++代码

之前把protobuf编好了,迫不及待写个小程序试一下

当protobuf编译安装完成后,就可以在命令行下任何目录输入命令:

[plain]  view plain copy print ?
  1. protoc proto文件路径 --cpp_out=C++代码文件导出目录  

在使用中我发现有一点需要注意,就是--cpp_out的目录是根据proto文件的路径为基础的,也就是说:假设proto文件位于src目录下,希望将C++代码也导出到src目录下,那么--cpp_out直接=.就可以了。不需要再写一遍src/,如果写了src/,那么代码导出的目录将是src/src/(即使src/src不存在,也会被创建)

注意:

1.proto文件路径要有文件名,而--cpp_out路径不能有文件名,只能是路径

例如,.proto当前目录下,想把C++代码也生成到当前目录下,应该如下调用protoc:

[plain]  view plain copy print ?
  1. protoc xxxx.proto --cpp_out=.  

2.最好是cd到proto文件所在的目录再导出,否则会出现生成出来的文件找不到头文件的问题

protobuf生成C++代码时会在同一个目录下生成两个文件,一个.cc一个.h,生成的.cpp文件会include生成的.h文件,而如果不cd到proto文件所在目录去操作,那就可能会出现.cc文件包含.h文件时路径错误

例如:.proto文件在src目录下,导出代码也导出到src目录下,可能执行如下命令

[plain]  view plain copy print ?
  1. protoc src/xxxx.proto --cpp_out=.  
不出所料,src目录下确实出现了生成的.cc和.h文件,但是一编译,就会报错了

原因是找不到头文件"src/xxxx.pb.h",原来,protobuf把执行命令时proto文件所在目录的路径也加到生成的代码中了。

所以要想避免这个问题,就cd到protobuf所在的目录再去操作。例如上例的解决办法就是

cd src

[plain]  view plain copy print ?
  1. protoc xxxx.proto --cpp_out=.  
这样一来,再编译,就不会有任何问题了


【二】.链接protobuf的静态库

如果只将protoc生成的代码头文件和代码文件加入工程,在链接阶段会报错,错误内容大致就是未定义的方法XXXXX云云,一看就是没有包含protobuf的静态库,但我在protobuf的目录下找了半天也没找到静态库在生成到哪了。

后来突然想到在之前的一篇文章中说到过protobuf是将lib安装到/usr/local/lib下了,而这个目录应该是默认包含目录之一(不一定是,取决于OS及版本),所以不需要设置链接路径,只需直接在Makefile/CMakeLists.txt中链接库“protobuf”即可编译通过。如果问题依旧,那可能是/usr/local/lib没有被加入到默认的包含环境,解决方法在这篇文章也有讲到


原文连接 : http://blog.csdn.net/xocoder/article/details/9173947


ubuntu下编译protobuf

1.下载protobuf
下载地址:http://code.google.com/p/protobuf/downloads/list

2.编译protobuf
解压下载的zip包,cd到protobuf的目录下,执行以下指令:
./configure
make
make check
make install

3.检查安装是否成功
protoc --version
如果成功,则会输出版本号信息,例如:libprotoc 2.5.0
如果有问题,则会输出错误内容。

4.错误及解决方法
protoc: error while loading shared libraries: libprotoc.so.8: cannot open shared
错误原因:
protobuf的默认安装路径是/usr/local/lib,而/usr/local/lib 不在Ubuntu体系默认的 LD_LIBRARY_PATH 里,所以就找不到该lib
解决方法:
方法1. 加入到文件中/etc/ld.so.conf

1>. 创建文件 /etc/ld.so.conf.d/libprotobuf.conf 包含内容:

[plain]  view plain copy print ?
  1. /usr/local/lib  
2>. 输入命令
sudo ldconfig 

方法2 : 把当前路径加入环境变量LD_LIBRARY_PATH中

export LD_LIBRARY_PATH=YOU_PATH:$LD_LIBRARY_PATH

[YOU_PATH : 表示你的动态库路径]


这时,再运行protoc --version 就可以正常看到版本号了

原文连接2 : http://blog.csdn.net/xocoder/article/details/9155901


另外, 如果出现未定函数或者重复定义之类的错误, 就要注意生成protobuf工具的版本问题, 不同版本之间会有不同的函数原型调用, 只需要保证在makefile中链接的库, 与编译.proto文件的库是同一个库就ok了

你可能感兴趣的:(C/C++)