The
qtprotobufgen
tool can be used to generate
QtProtobuf
classes from a protobuf schema. The tool is provided by the CMake
Qt6::ProtobufTools
package. It works as an extension to Google's
protoc
工具。
find_package(Qt6 COMPONENTS ProtobufTools REQUIRED)
Qt provides CMake functions that ease the use of the
qtprotobufgen
tool. When using CMake as a build tool you should prefer using the Qt CMake API. For build systems other than CMake, adapt the commands described in
Running manually
.
注意: there is no explicit support for building gRPC and Protobuf applications using the Qt GRPC module with qmake .
The following CMake commands integrate a protobuf schema into a Qt project.
qt_add_protobuf | Generates Qt-based C++ source code using a protobuf schema |
Usually
qtprotobufgen
would be invoked through CMake using the
qt_add_protobuf
macro, as shown in the following example:
cmake_minimum_required(VERSION 3.16...3.22) project(MyThings) find_package(Qt6 REQUIRED COMPONENTS Protobuf) qt_standard_project_setup() qt_add_protobuf(MyMessages GENERATE_PACKAGE_SUBFOLDERS PROTO_FILES path/to/message.proto path/to/other_message.proto PROTO_INCLUDES /path/to/proto/include ) qt_add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE MyMessages)
In the example above we generate a library called
MyMessages
which contains the message types defined in the paths passed to the
PROTO_FILES
option. We use the
GENERATE_PACKAGE_SUBFOLDERS
option to generate a folder structure for the generated files. And the
PROTO_INCLUDES
option tells protoc to look for dependencies/imports in the specified directories.
We then create a target for an executable called
MyApp
which we link to the
MyMessages
库。
protoc --plugin=protoc-gen-qtprotobuf=<path/to/bin/>qtprotobufgen \ --qtprotobuf_out="[<options>:]<output_dir>" \ [--qtprotobuf_opt="<options>"] \ [-I/extra/proto/include/path] \ <protofile>.proto
The
options
argument is a semicolon-separated list of
Options
. It can be passed in
two
different ways. Either by prepending to the options to the output_dir argument, delimited by a colon. Or through a separate argument,
--qtprotobuf_opt
. You also can pass the corresponding keys as the
QT_PROTOBUF_OPTIONS
environment variable. Keys need to be presented as a semicolon-separated list:
export QT_PROTOBUF_OPTIONS="COPY_COMMENTS;GENERATE_PACKAGE_SUBFOLDERS;EXTRA_NAMESPACE=MyTopLevelNamespace"
The generator supports options that can be provided to tune generation. Options have direct aliases in the qt_add_protobuf function. The following options are supported:
COPY_COMMENTS
Copies comments from
.proto
files. If provided in the parameter list, comments related to messages and fields are copied to generated header files.
GENERATE_PACKAGE_SUBFOLDERS
generates a folder structure for the generated files matching the
.proto
file's package name. For example
package io.qt.test;
would put the generated files into
io/qt/test/
.
EXTRA_NAMESPACE
is an optional namespace that will be used for the generated classes. The classes are always generated in a namespace whose name is the same as the package name specified in the
.proto
file. If this option is used then everything will be nested inside the extra namespace.
EXPORT_MACRO
is the base name of the symbol export macro used for the generated code. The generated macro name is constructed as
QPB_<EXPORT_MACRO>_EXPORT
. If the option is not set, the macro is not generated.