欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[cmake 3.5]使用自身集成的FindProtobuf来生成并构建proto代码

程序员文章站 2022-07-15 16:44:53
...

 

使用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版本有效。

相关标签: cmake