[cmake 3.5]使用本身集成的FindProtobuf来生成并构建proto代码
[cmake 3.5]使用自身集成的FindProtobuf来生成并构建proto代码
使用FindProtobuf,可以不用手动执行protoc命令,nmake的时候自动去执行protoc,然后再编译链接生成静态库。如果proto文件之间有相互引用(使用了import),貌似会有问题,这个不知道当前版修复没,后面有空再测。
目录结构:
/proto-build
|—— build/ #empty, used for cmake building
|—— include/
|—— google/ #protobuf headers
|—— proto/
|—— test.proto
|—— CMakeLists.txt
|—— protoc.exe
/protoc.exe
这里有两个protoc.exe:一个在proto-build内部,一个与proto-build同级。至于为什么,我也不清楚。。反正少其中一个就会提示找不到protoc.exe,不清楚是其他参数没设置正确,还是cmake的bug。这个问题折腾了整整半天,一会正常一会又不正常。
CMakeLists.txt
注:仅适用于3.x版本,2.x版本不适用
cmake_minimum_required(VERSION 3.5) set(CMAKE_VERBOSE_MAKEFILE ON) SET(ROOT_PATH ".") SET(PROTO_DIR ${ROOT_PATH}/proto) #PROTOBUF_INCLUDE_DIR和PROTOBUF_LIBRARY两个变量必须设置,貌似可以随便设置,不设置但会提示让你设置,感觉像是bug SET(PROTOBUF_INCLUDE_DIR .) SET(PROTOBUF_LIBRARY .) SET(PROTOBUF_PROTOC_EXECUTABLE ../protoc.exe) #指向protobuf头文件的目录,里面的上层目录是<google> SET(THIRD_INCLUDE_DIR ${ROOT_PATH}/include) #包含protobuf头文件,这里必须设置,如果将PROTOBUF_INCLUDE_DIR指向protobuf头文件,而不设置include_directories,也会报错。 include_directories(${THIRD_INCLUDE_DIR}) file(GLOB PROTO_LIST ${PROTO_DIR}/*.proto) find_package(Protobuf REQUIRED) protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) add_library(foo STATIC ${PROTO_SRCS} ${PROTO_HDRS}) target_link_libraries(foo)
执行命令:
cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release ..
nmake