关闭

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

20506人阅读 评论(0) 收藏 举报
分类:

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

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

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

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:

protoc xxxx.proto --cpp_out=.

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

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

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

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

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

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

cd src

protoc xxxx.proto --cpp_out=.

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


【二】.链接protobuf的静态库

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

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

4
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:330071次
    • 积分:3541
    • 等级:
    • 排名:第9304名
    • 原创:74篇
    • 转载:37篇
    • 译文:0篇
    • 评论:76条
    好站链接
    尤龙同学的代码与诗歌