编译proto文件

 

protoc编译1

# 编译所有的 .proto 文件
$ protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/*.proto
# 这之后就会得到 *.proto.h 和 *.proto.cc,就可以随便拿到 c++ 项目去使用了

cmake编译2.3

==主角:protobuf_generate_cpp==

举个最简单的例子

ps: `CMAKE_CURRENT_BINARY_DIR`和 `PROJECT_BINARY_DIR` 是一个目录,都是用户当前的build文件夹,也就是运行cmake时所处的文件夹(不是CMakeLists.txt所在的文件夹!)
# 工作目录
.
├── CMakeLists.txt
├── demo.proto
├── add_person.cc
├── list_people.cc
├── addressbook.proto
project(proto_example)

# Find required protobuf package
find_package(protobuf CONFIG REQUIRED)

if(protobuf_VERBOSE)
  message(STATUS "Using Protocol Buffers ${protobuf_VERSION}")
else()
	message(FATAL_ERROR "Protobuf Not Found!")
endif()

add_compile_options(-O0)

# syntax: protobuf_generate_cpp(生成的.cc文件名 生成的.h文件名 来源.proto文件)
## 默认名字生成规则:demo.proto.h demo.proto.cc
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS demo.proto)
## 默认名字生成规则:demo.proto.h demo.proto.cc

## 指定名字(这种只做演示用,后续不再使用这里面生成的 .h .cc)
foreach(example add_person list_people)
	## set 命令创建列表
  set(${example}_SRCS ${example}.cc)
  set(${example}_PROTOS addressbook.proto)

  #Code Generation
  if(protobuf_MODULE_COMPATIBLE) #Legacy Support
    protobuf_generate_cpp(${example}_PROTO_SRCS ${example}_PROTO_HDRS ${${example}_PROTOS})
    # 为列表 ${example}_SRCS 追加元素
    list(APPEND ${example}_SRCS ${${example}_PROTO_SRCS} ${${example}_PROTO_HDRS})
  endif()
## 指定名字

add_library(proto_example SHARED ${PROTO_SRCS})
target_link_libraries(proto_example ${PROTOBUF_LIBRARIES})

参考资料

  1. Compiling Your Protocol Buffers
  2. protobuf/example/CMakeLists.txt
  3. Cmake命令之list介绍