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_cppprotobuf_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 文件到 Python

protobuf_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)