protoc支持c_[cmake 2.x]解析protobuf模版(*.proto)并构建其C++代码

有两种方式,一种是使用cmake自带的FindProtobuf module,这个模块内部集成了生成代码命令的操作,用起来最方便;另外一种是将protoc命令集成到CMakeLists.txt中,这种要麻烦点。

自带的FindProtobuf

方法如下:

使用cmake自带的FindProtobuf解析protobuf

但是我按照文章试了一遍,结果不成功,最后nmake错误时提示:

NMAKE : fatal error U1073: don't know how to make 'E:\Source\proto-build\PROTOBUF_PROTOC_EXECUTABLE-NOTFOUND'

Stop.

NMAKE : fatal error U1077: '"D:\Program_Filesx86\Microsoft Visual Studio 14.0\VC\BIN\amd64\nmake.exe"' : return code '0x2'

Stop.

NMAKE : fatal error U1077: '"D:\Program_Filesx86\Microsoft Visual Studio 14.0\VC\BIN\amd64\nmake.exe"' : return code '0x2'

Stop.

可能原因:

上文是在gcc编译器下进行的,而我是在windows nmake上进行的,不知道是不是平台问题的差异。

另外我用的版本是3.5,上文用的是2.8,版本差异也可能是一个原因。

集成protoc命令来构建

cmake自动生成protobuf代码

这个我还没亲自试过,不知道在nmake是否可行。

不过我手动执行protoc生成c++代码后,再执行cmake构建命令将这些C++代码编译程静态库lib是成功的。

注意事项:

如果proto文件中使用了import,也就是一个proto引用了另外一个proto,那么第一种方法FindProtobuf就会出错,然后你还是得中第二种方法,即将protoc命令集成到CMakeLists.txt

另外import报错的问题在3.0版本已经修复,可以直接使用其内部集成的FindProtobuf直接生成,有import也能正常解析并编译:http://aigo.iteye.com/blog/2295228

其他参考:

CMake and FindProtobuf(讲的不错,提到了一些容易疏忽的cmake细节特性)

最原始的手动构建方式

示例的目录结构如下:

proto-mylib

|—— build/           #空文件夹,用于cmake编译生成

|—— include/

|—— google/      #protobuf头文件

|—— lib/

|—— libprotobuf-lite.lib  #windows静态库

|—— src/

|—— test.pb.h       #protoc生成代码

|—— test.pb.cc       #protoc生成代码

|—— CMakeLists.txt

CMakeLists.txt内容为(注:我这里用的是3.5,2.x版本没试过):

cmake_minimum_required(VERSION 3.5)

SET(ROOT_PATH ".")

SET(PROTOC_GEN_DIR ${ROOT_PATH}/src)

SET(THIRD_LIB_DIR ${ROOT_PATH}/lib)

SET(THIRD_INCLUDE_DIR ${ROOT_PATH}/include)

include_directories(${THIRD_INCLUDE_DIR})

link_directories(${THIRD_LIB_DIR})

file(GLOB PROTO_SRCS ${PROTOC_GEN_DIR}/*.cc)

file(GLOB PROTO_HEADERS ${PROTOC_GEN_DIR}/*.h)

add_library(proto-mylib STATIC ${PROTO_SRCS})

target_link_libraries(proto-mylib libprotobuf-lite)

执行命令:

cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release ..

nmake

这样就得到了一个静态库:proto-mylib.lib

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值