分享

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

 honeyeyo 2016-07-22

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

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

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

  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:

  1. protoc xxxx.proto --cpp_out=.  

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

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

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

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

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

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

cd src

  1. protoc xxxx.proto --cpp_out=.  

这样一来,再编译,就不会有任何问题了


【二】.链接protobuf的静态库

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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多