[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 include)
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(mylib STATIC ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(mylib)
执行命令:
cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release ..
nmake
或者使用下面的批处理:
RD mylib\build\ /s /q
mkdir mylib\build\
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
cd /D E:\mylib\build\
cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release ..
nmake
2017-12更新:
CMake的FindProtobuf对protobuf3.x无效,只对2.x版本有效。
上一篇: CMakeLists.txt编写基础知识
下一篇: mySQL的一些坑