qt_add_protobuf
Erzeugt Qt-basierten C++-Quellcode unter Verwendung eines Protobuf-Schemas
Hinweis: Dieser Befehl befindet sich in der Technologievorschau und kann sich in zukünftigen Versionen ändern.
Dieser Befehl wurde in Qt 6.5 eingeführt.
Verwenden Sie qt_add_protobuf, um qtprotobufgen
in Ihren CMake-Skripten aufzurufen und den Code aus den .proto-Schemata für Ihre Projekte zu generieren.qtprotobufgen
würde durch CMake mit dem Befehl qt_add_protobuf
aufgerufen werden.
qt_add_protobuf(<target> PROTO_FILES <file> ... [PROTO_INCLUDES <path> ...] [QML [QML_URI <uri>]] [OUTPUT_DIRECTORY <dir>] [GENERATE_PACKAGE_SUBFOLDERS] [COPY_COMMENTS] [EXPORT_MACRO <infix>] [OUTPUT_HEADERS <var>] [OUTPUT_TARGETS <var>] )
Die von qtprotobufgen
erzeugten Quelldateien werden dann zum Ziel hinzugefügt. Wenn das Ziel bereits existiert, werden die generierten Dateien zur Liste der Zielquellen hinzugefügt. Wenn das Ziel nicht existiert, wird es als Bibliothek erstellt, mit der Sie linken müssen.
Argumente
PROTO_FILES
gibt die Liste der .proto-Dateien an, die von der Code-Generierungsprozedur verwendet werden.PROTO_INCLUDES
gibt die Liste der Verzeichnisse an, die nach Protobuf-Abhängigkeiten durchsucht werden sollen.Hinweis: Der Speicherort von
PROTO_FILES
wird implizit als Teil des protobuf-Include-Pfads betrachtet.QML
ermöglicht die Erzeugung von QML-kompatiblen Nachrichtentypen aus Protobuf-Definitionen und registriert sie als QML-Modul. Wennqt_add_protobuf
für ein nicht existierendes Ziel oder ein Ziel, das kein QML-Modul ist, aufgerufen wird, wird implizit ein neues QML-Modul erstellt.find_package(Qt6 6.8 REQUIRED COMPONENTS Quick Protobuf ProtobufQuick) ... qt_add_executable(target ... ) // creates a new QML module qt_add_protobuf(target QML ... )
Wenn das Ziel ein bestehendes QML-Modul ist, fügt
qt_add_protobuf
die generierten Protobuf-Typen diesem Modul zu.find_package(Qt6 6.8 REQUIRED COMPONENTS Quick Protobuf ProtobufQuick) ... qt_add_qml_module(target ... ) // adds to existing QML module qt_add_protobuf(target QML ... )
Hinweis: Wenn Sie das QML-Argument verwenden, müssen Sie ProtobufQuick in den find_package-Aufruf aufnehmen. Siehe Beispiele oben.
QML_URI
definiert dieURI
, die für das QML-Modul verwendet wird.Jedes QML-Modul muss ein
URI
definieren, das in Import-Anweisungen verwendet wird, um seine Protobuf-Typen für QML freizugeben.qt_add_protobuf(target QML QML_URI proto.uri.example )
Wenn
QML_URI
weggelassen wird, wird der Name des protobuf-Pakets alsURI
des Moduls verwendet.Hinweis: Wenn
QML_URI
weggelassen wird, müssen alle im AbschnittPROTO_FILES
angegebenen .proto-Dateien denselben protobuf-Paketnamen haben, da dieser als StandardURI
für das resultierende QML-Modul verwendet wird.Hinweis: Es sollte vermieden werden, mehrere protobuf QML-Module mit demselben
QML_URI
oder proto-Paketnamen zu erstellen, da dies zu Importfehlern im QML-Kontext führt.Hinweis: Wenn
QML_URI
an die Funktionqt_add_protobuf
übergeben wird, das Ziel aber bereits existiert, wird das ArgumentQML_URI
ignoriert.Lesen Sie Identifizierte Module für eine weitergehende Diskussion der
URI
.OUTPUT_DIRECTORY
definiert das Verzeichnis, in dem die generierten Dateien abgelegt werden. Standardmäßig wird das aktuelle Build-Verzeichnis verwendet.GENERATE_PACKAGE_SUBFOLDERS
verwendet die Paketnamensangabe aus den.proto
Dateien, um die Ordnerstruktur für die generierten Dateien zu erstellen. Wenn das Paket zum Beispiel definiert ist als:package io.qt.test
werden die generierten Dateien in OUTPUT_DIRECTORY/io/qt/test/ abgelegt.COPY_COMMENTS
kopiert Kommentare aus den.proto
Dateien in den generierten Code.EXPORT_MACRO
gilt nur für die Erstellung einer neuen Shared Library aus <target>. Diese Option gibt den Basisnamen für das im generierten Code verwendete Exportmakro an. Der endgültige Makroname wird wieQPB_<EXPORT_MACRO>_EXPORT
aufgebaut. Wenn diese Option nicht gesetzt ist, wird der ZielnameEXPORT_MACRO
verwendet.Weitere ausführliche Informationen finden Sie unter Gemeinsame Bibliotheken erstellen.
OUTPUT_HEADERS
gibt eine Variable an, in der die Liste der generierten Header gespeichert wird. Diese Liste kann für die Definition von benutzerdefinierten Projektinstallationsregeln nützlich sein.OUTPUT_TARGETS
gibt eine Variable an, in der die Liste der generierten Targets gespeichert wird. Diese Liste kann für die Definition von benutzerdefinierten Projektinstallationsregeln nützlich sein.
Auflösen von Abhängigkeiten zwischen protobuf-Zielen
Der Befehl qt_add_protobuf
berücksichtigt nicht die Abhängigkeiten zwischen .proto
Dateien, die verwendet werden, um Code für verschiedene Ziele zu generieren.
Das Projekt kann zwei oder mehr .proto
Dateien mit Abhängigkeiten haben:
// test_messages.proto syntax = "proto3"; package test.messages; message MyMessage { int32 myField = 1; }
// test_extensions.proto syntax = "proto3"; import "test_messages.proto"; package test.extensions; message MyExtension { test.messages.MyMessage baseMessage = 1; int32 extension = 2; }
Die oben genannten .proto
Dateien können verwendet werden, um die Standalone-Bibliotheken zu generieren:
qt_add_protobuf(test_messages PROTO_FILES test_messages.proto ) ... qt_add_protobuf(test_extensions PROTO_FILES test_extensions.proto ) ...
Da das test_extensions
-Ziel von Nachrichten aus dem test_messages
-Ziel abhängt, müssen Sie in Ihren CMake
-Skripten manuell zu diesen Zielen linken:
target_link_libraries(test_extensions PUBLIC test_messages)
Hinweis: Nachrichten aus dem test_messages
-Ziel werden in Header-Dateien verwendet, die zum test_extensions
-Ziel gehören, daher sollten Ziele, die auf test_extensions
linken, das test_messages
-Ziel als transitive Abhängigkeit haben. Es wird empfohlen, den PUBLIC
linking scope zu verwenden, um die richtigen INTERFACE_INCLUDE_DIRECTORIES
und INTERFACE_LINK_LIBRARIES
Eigenschaften für protobuf library targets zu haben.
Beispiel
Verwendung von qt_add_protobuf
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)
Im obigen Beispiel wird eine Bibliothek mit dem Namen MyMessages
erzeugt, die die Nachrichtentypen enthält, die in den mit der Option PROTO_FILES
übergebenen Pfaden definiert sind. Die Option GENERATE_PACKAGE_SUBFOLDERS
generiert eine Ordnerstruktur für die erzeugten Dateien. Und die Option PROTO_INCLUDES
weist protoc an, in den angegebenen Verzeichnissen nach Abhängigkeiten oder Importen zu suchen. Wir erstellen ein Ziel für eine ausführbare Datei namens MyApp
, die wir mit der Bibliothek MyMessages
verknüpfen.
QML erweitertes protobuf Beispiel
cmake_minimum_required(VERSION 3.16...3.22) project(MyThings) find_package(Qt6 REQUIRED COMPONENTS Protobuf ProtobufQuick Quick) qt_standard_project_setup() qt_add_protobuf(MyMessagesPlugin QML QML_URI my.messages.module.uri PROTO_FILES path/to/message.proto path/to/other_message.proto PROTO_INCLUDES /path/to/proto/include ) qt_add_protobuf(MyApp QML PROTO_FILES path/to/internal_message.proto PROTO_INCLUDES /path/to/proto/include ) qt_add_qml_module(MyApp URI example.uri VERSION 1.0 QML_FILES qml/main.qml ) qt_add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE Quick)
Im obigen erweiterten QML-Beispiel wird durch den ersten Aufruf von qt_add_protobuf
ein QML-Modul mit der Bezeichnung MyMessagesPlugin
erzeugt, das die in den an die Option PROTO_FILES
übergebenen Pfaden definierten Nachrichtentypen enthält. Wir verwenden die Option QML
, die die Registrierung von Proto-Nachrichtentypen im Kontext QML
ermöglicht. Die registrierten Typen stehen in QML
zur Verfügung, indem ein Pfad importiert wird, der mit QML_URI
festgelegt wurde. Mit dem zweiten Aufruf von qt_add_protobuf
fügen wir automatisch generierten Code in das bestehende MyApp
QML-Modul ein. Die QML_URI
ist in solchen Fällen nicht erforderlich. Schließlich erstellen wir ein Ziel für eine ausführbare Datei namens MyApp
, die ein QML-Modul für den grafischen Teil enthält und MyMessagesPlugin
über den my.messages.module.uri
-Import in die Datei main.qml lädt.
Installation der eigenständigen Bibliothek Qt Protobuf
Der Befehl qt_add_protobuf erzeugt auch Listen von Artefakten für die weitere Installation. Sie können diese Artefakte lesen, indem Sie die Argumente OUTPUT_HEADERS
, und OUTPUT_TARGETS
wie folgt angeben:
qt_add_protobuf(MyProtoLib PROTO_FILES mylib.proto OUTPUT_HEADERS public_headers OUTPUT_TARGETS generated_targets )
Der Befehl speichert die Liste der Header-Dateien und Targets, die durch den Befehl qt_add_protobuf
erzeugt wurden, in den Variablen public_headers
und generated_targets
.
Verwenden Sie den Standard CMake install
Befehl, um die Artefakte zu installieren und die config
Dateien für Ihre Bibliothek zu erzeugen:
include(GNUInstallDirs) set_target_properties(MyProtoLib PROPERTIES PUBLIC_HEADER "${public_headers}" INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}>" ) install(TARGETS ${generated_targets} EXPORT MyProtoLibTargets PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) install(EXPORT MyProtoLibTargets NAMESPACE MyProtoLib:: DESTINATION lib/cmake/MyProtoLib)
Verwenden Sie dann die generierte MyProtoLibTargets
config in der Paketkonfigurationsdatei. Sie können mehr über den Prozess der Paketerstellung in der offiziellen CMake-Dokumentation lesen.
Nach der Installation ist die Bibliothek als eigenständiges CMake-Paket verfügbar:
find_package(Qt6 COMPONENTS Protobuf) find_package(MyProtoLib CONFIG) add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE MyProtoLib::MyProtoLib Qt6::Protobuf)
Hinweis: qt_add_protobuf fügt nicht implizit das Qt Protobuf
Modul als transitive Abhängigkeit hinzu, weder für das MyProtoLib
Ziel noch für das MyProtoLib
CMake-Paket. Daher muss die Qt Protobuf
Modul-Lookup und die explizite Verknüpfung von MyApp
mit Qt6::Protobuf
zwingend erforderlich.
Siehe auch Das Werkzeug qtprotobufgen.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.