【一】.如何用.proto文件导出C++代码
之前把protobuf编好了,迫不及待写个小程序试一下
当protobuf编译安装完成后,就可以在命令行下任何目录输入命令:
在使用中我发现有一点需要注意,就是--cpp_out的目录是根据proto文件的路径为基础的,也就是说:假设proto文件位于src目录下,希望将C++代码也导出到src目录下,那么--cpp_out直接=.就可以了。不需要再写一遍src/,如果写了src/,那么代码导出的目录将是src/src/(即使src/src不存在,也会被创建)
注意:
1.proto文件路径要有文件名,而--cpp_out路径不能有文件名,只能是路径
例如,.proto当前目录下,想把C++代码也生成到当前目录下,应该如下调用protoc:
protobuf生成C++代码时会在同一个目录下生成两个文件,一个.cc一个.h,生成的.cpp文件会include生成的.h文件,而如果不cd到proto文件所在目录去操作,那就可能会出现.cc文件包含.h文件时路径错误
例如:.proto文件在src目录下,导出代码也导出到src目录下,可能执行如下命令
原因是找不到头文件"src/xxxx.pb.h",原来,protobuf把执行命令时proto文件所在目录的路径也加到生成的代码中了。
所以要想避免这个问题,就cd到protobuf所在的目录再去操作。例如上例的解决办法就是
cd src
【二】.链接protobuf的静态库
如果只将protoc生成的代码头文件和代码文件加入工程,在链接阶段会报错,错误内容大致就是未定义的方法XXXXX云云,一看就是没有包含protobuf的静态库,但我在protobuf的目录下找了半天也没找到静态库在生成到哪了。
后来突然想到在之前的一篇文章中说到过protobuf是将lib安装到/usr/local/lib下了,而这个目录应该是默认包含目录之一(不一定是,取决于OS及版本),所以不需要设置链接路径,只需直接在Makefile/CMakeLists.txt中链接库“protobuf”即可编译通过。如果问题依旧,那可能是/usr/local/lib没有被加入到默认的包含环境,解决方法在这篇文章也有讲到
联系客服