FindProtobuf¶
定位并配置 Google Protocol Buffers 库。
3.6 版本新增: 支持 find_package()
版本检查。
3.6 版本变更: 所有输入和输出变量都使用 Protobuf_
前缀。为了兼容性,仍然支持带有 PROTOBUF_
前缀的变量。
以下变量可以设置,并且是可选的
Protobuf_SRC_ROOT_FOLDER
当使用 MSVC 编译时,如果设置了此缓存变量,将在 protobuf-default VS 项目构建位置(vsprojects/Debug 和 vsprojects/Release 或 vsprojects/x64/Debug 和 vsprojects/x64/Release)中搜索库和二进制文件。
Protobuf_IMPORT_DIRS
要搜索导入的 .proto 文件的其他目录列表。
Protobuf_DEBUG
3.6 版本新增。
显示调试信息。
Protobuf_USE_STATIC_LIBS
3.9 版本新增。
设置为 ON 以强制使用静态库。默认为 OFF。
定义以下变量
Protobuf_FOUND
找到 Google Protocol Buffers 库(libprotobuf & 头文件)
Protobuf_VERSION
3.6 版本新增。
找到的软件包版本。
Protobuf_INCLUDE_DIRS
Google Protocol Buffers 的包含目录
Protobuf_LIBRARIES
protobuf 库
Protobuf_PROTOC_LIBRARIES
protoc 库
Protobuf_LITE_LIBRARIES
protobuf-lite 库
3.9 版本新增: 还定义了以下 IMPORTED
目标
protobuf::libprotobuf
protobuf 库。
protobuf::libprotobuf-lite
protobuf lite 库。
protobuf::libprotoc
protoc 库。
protobuf::protoc
3.10 版本新增: protoc 编译器。
以下缓存变量也可用于设置或使用
Protobuf_LIBRARY
protobuf 库
Protobuf_PROTOC_LIBRARY
protoc 库
Protobuf_INCLUDE_DIR
protocol buffers 的包含目录
Protobuf_PROTOC_EXECUTABLE
protoc 编译器
Protobuf_LIBRARY_DEBUG
protobuf 库 (debug)
Protobuf_PROTOC_LIBRARY_DEBUG
protoc 库 (debug)
Protobuf_LITE_LIBRARY
protobuf lite 库
Protobuf_LITE_LIBRARY_DEBUG
protobuf lite 库 (debug)
示例
find_package(Protobuf REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS foo.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS EXPORT_MACRO DLL_EXPORT foo.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS DESCRIPTORS PROTO_DESCS foo.proto)
protobuf_generate_python(PROTO_PY foo.proto)
add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(bar ${Protobuf_LIBRARIES})
注意
protobuf_generate_cpp
和 protobuf_generate_python
函数以及 add_executable()
或 add_library()
调用仅在同一目录中正常工作。
- protobuf_generate_cpp¶
添加自定义命令以处理
.proto
文件到 C++protobuf_generate_cpp ( <srcs-var> <hdrs-var> [DESCRIPTORS <var>] [EXPORT_MACRO <macro>] [<proto-file>...])
<srcs-var>
要使用自动生成的源文件定义的变量
<hdrs-var>
要使用自动生成的头文件定义的变量
DESCRIPTORS <var>
3.10 版本新增: 如果请求,要使用自动生成的描述符文件定义的变量。
EXPORT_MACRO <macro>
是一个宏,应扩展为
__declspec(dllexport)
或__declspec(dllimport)
,具体取决于正在编译的内容。<proto-file>...
.proto
文件
- protobuf_generate_python¶
3.4 版本新增。
添加自定义命令以处理
.proto
文件到 Pythonprotobuf_generate_python (<py-srcs-var> [<proto-file>...])
<py-srcs-var>
要使用自动生成的 Python 文件定义的变量
<proto-file>...
.proto
文件
- protobuf_generate¶
3.13 版本新增。
在构建时从
.proto
schema 文件自动生成源文件protobuf_generate ( TARGET <target> [LANGUAGE <lang>] [OUT_VAR <var>] [EXPORT_MACRO <macro>] [PROTOC_OUT_DIR <dir>] [PLUGIN <plugin>] [PLUGIN_OPTIONS <plugin-options>] [DEPENDENCIES <dependencies>] [PROTOS <proto-file>...] [IMPORT_DIRS <dir>...] [GENERATE_EXTENSIONS <extension>...] [PROTOC_OPTIONS <option>...] [PROTOC_EXE <executable>] [APPEND_PATH])
APPEND_PATH
一个标志,使所有 proto schema 文件的基本路径添加到
IMPORT_DIRS
。LANGUAGE <lang>
单个值:cpp 或 python。确定正在生成哪种类型的源文件。默认为 cpp。
OUT_VAR <var>
将填充生成的源文件路径的 CMake 变量的名称。
EXPORT_MACRO <macro>
应用于所有生成的 Protobuf 消息类和外部变量的宏的名称。例如,它可以用于声明 DLL 导出。
PROTOC_OUT_DIR <dir>
生成的源文件的输出目录。默认为
CMAKE_CURRENT_BINARY_DIR
。PLUGIN <plugin>
3.21 版本新增。
一个可选的插件可执行文件。例如,这可以是
grpc_cpp_plugin
的路径。PLUGIN_OPTIONS <plugin-options>
3.28 版本新增。
提供给插件的其他选项,例如 gRPC cpp 插件的
generate_mock_code=true
。DEPENDENCIES <dependencies>
3.28 版本新增。
转发到基础
add_custom_command
调用的DEPENDS
的参数。TARGET <target>
CMake 目标,将生成的文件添加为源文件。
PROTOS <proto-file>...
proto schema 文件列表。如果省略,则将使用
TARGET
中以 proto 结尾的每个源文件。IMPORT_DIRS <dir>...
schema 文件的公共父目录。例如,如果 schema 文件是
proto/helloworld/helloworld.proto
并且导入目录是proto/
,则生成的文件是${PROTOC_OUT_DIR}/helloworld/helloworld.pb.h
和${PROTOC_OUT_DIR}/helloworld/helloworld.pb.cc
。GENERATE_EXTENSIONS <extension>...
如果省略 LANGUAGE,则必须将其设置为 protoc 生成的扩展名。
PROTOC_OPTIONS <option>...
3.28 版本新增。
转发到 protoc 的其他参数。
PROTOC_EXE <executable>
4.0 版本新增。
用于生成 protobuf 绑定的命令名称、路径或 CMake 可执行文件。如果省略,则使用
protobuf::protoc
。
示例
find_package(gRPC CONFIG REQUIRED) find_package(Protobuf REQUIRED) add_library(ProtoTest Test.proto) target_link_libraries(ProtoTest PUBLIC gRPC::grpc++) protobuf_generate(TARGET ProtoTest) protobuf_generate( TARGET ProtoTest LANGUAGE grpc PLUGIN protoc-gen-grpc=$<TARGET_FILE:gRPC::grpc_cpp_plugin> PLUGIN_OPTIONS generate_mock_code=true GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc)