qt_add_protobuf
프로토뷰 스키마를 사용하여 Qt 기반 C++ 소스 코드를 생성합니다.
이 명령은 Qt 6.5에 도입되었습니다.
qt_add_protobuf를 사용하여 CMake 스크립트에서 qtprotobufgen 을 호출하고 프로젝트의 .proto 스키마에서 코드를 생성합니다.qtprotobufgen 은 qt_add_protobuf 명령을 사용하여 CMake를 통해 호출됩니다.
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>]
[HEADER_GUARD <pragma|filename>]
)그런 다음 qtprotobufgen 에서 생성된 소스 파일이 대상에 추가됩니다. 타깃이 이미 존재하는 경우 생성된 파일이 타깃 소스 목록에 추가됩니다. 타깃이 존재하지 않으면 링크해야 하는 라이브러리로 생성됩니다.
인수
PROTO_FILES코드 생성 절차에 사용되는 .proto 파일 목록을 지정합니다.PROTO_INCLUDESprotobuf 종속성을 검색할 디렉터리 목록을 지정합니다.참고:
PROTO_FILES의 위치는 암시적으로 protobuf 포함 경로의 일부로 간주됩니다.QML는 protobuf 정의에서 QML 호환 메시지 유형을 생성하고 이를 QML 모듈로 등록할 수 있도록 합니다. 존재하지 않는 대상 또는 QML 모듈이 아닌 대상에서qt_add_protobuf을 호출하면 암시적으로 새 QML 모듈이 만들어집니다.find_package(Qt6 6.8 REQUIRED COMPONENTS Quick Protobuf ProtobufQuick) ... qt_add_executable(target ... ) // creates a new QML module qt_add_protobuf(target QML ... )대상이 기존 QML 모듈인 경우
qt_add_protobuf은 생성된 프로토뷰 유형을 해당 모듈에 첨부합니다.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 ... )참고: QML 인수를 사용하는 경우, find_package 호출에 ProtobufQuick을 추가해야 합니다. 위의 예시를 참조하세요.
QML_URI는 QML 모듈에 사용되는URI를 정의합니다.모든 QML 모듈은 반드시
URI를 정의해야 하며, 이는 임포트 문에서 해당 프로토뷰 유형을 QML에 노출하는 데 사용됩니다.qt_add_protobuf(target QML QML_URI proto.uri.example )QML_URI을 생략하면 protobuf 패키지 이름이 모듈의URI으로 사용됩니다.참고:
QML_URI을 생략한 경우,PROTO_FILES섹션에 지정된 모든 .proto 파일은 결과 QML 모듈의 기본값URI으로 사용되므로 동일한 protobuf 패키지 이름을 공유해야 합니다.참고: 동일한
QML_URI또는 proto 패키지 이름으로 여러 개의 protobuf QML 모듈을 만들면 QML 컨텍스트에서 가져오기 오류가 발생할 수 있으므로 피해야 합니다.참고:
qt_add_protobuf함수에QML_URI가 전달되었지만 대상이 이미 존재하는 경우QML_URI인수는 무시됩니다.URI에 대한 자세한 내용은 식별된 모듈을 참조하세요.OUTPUT_DIRECTORY는 생성된 파일이 저장될 디렉터리를 정의합니다. 기본적으로 현재 빌드 디렉터리가 사용됩니다.GENERATE_PACKAGE_SUBFOLDERS는.proto파일의 패키지 이름 지정자를 사용하여 생성된 파일의 폴더 구조를 만듭니다. 예를 들어 패키지가 다음과 같이 정의된 경우package io.qt.test로 정의된 경우 생성된 파일은 출력 디렉토리/io/qt/test/에 배치됩니다.COPY_COMMENTS는.proto파일의 주석을 생성된 코드에 복사합니다.EXPORT_MACRO<대상>에서 새 공유 라이브러리를 생성할 때만 적용됩니다 . 이 옵션은 생성된 코드에 사용되는 내보내기 매크로의 기본 이름을 지정합니다. 최종 매크로 이름은QPB_<EXPORT_MACRO>_EXPORT로 구성됩니다. 이 옵션을 설정하지 않으면 대상 이름이EXPORT_MACRO로 사용됩니다.자세한 내용은 공유 라이브러리 만들기를 참조하세요.
OUTPUT_HEADERS생성된 헤더 목록을 저장할 변수를 지정합니다. 이 목록은 사용자 지정 프로젝트 설치 규칙을 정의하는 데 유용할 수 있습니다.OUTPUT_TARGETS생성된 대상 목록을 저장할 변수를 지정합니다. 이 목록은 사용자 지정 프로젝트 설치 규칙을 정의하는 데 유용할 수 있습니다.HEADER_GUARD생성된 헤더 파일이 여러 개 포함되지 않도록 보호하는 데 사용되는 메커니즘을 지정합니다. 가능한 값은pragma,filename입니다. 기본값은filename입니다. 옵션을pragma으로 설정하면 최신 프라그마 헤더 가드가 생성됩니다:#pragma once ...
옵션을 생략하거나
filename로 설정하면ifdef래핑 가드가 생성되며, '.proto' 파일명을 가드 접두사로 사용합니다:#ifdef MYMESSAGES_QPB_H #define MYMESSAGES_QPB_H ... #endif // MYMESSAGES_QPB_H
프로젝트 구조에 따라 선호하는 가드 스타일을 선택하세요.
protobuf 대상 간의 종속성 해결하기
qt_add_protobuf 명령은 서로 다른 대상에 대한 코드를 생성하는 데 사용되는 .proto 파일 간의 종속성을 고려하지 않습니다.
프로젝트에 종속성이 있는 .proto 파일이 두 개 이상 있을 수 있습니다:
// 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;
}위의 .proto 파일은 독립형 라이브러리를 생성하는 데 사용할 수 있습니다:
qt_add_protobuf(test_messages
PROTO_FILES
test_messages.proto
)
...
qt_add_protobuf(test_extensions
PROTO_FILES
test_extensions.proto
)
...test_extensions 대상은 test_messages 대상의 메시지에 의존하므로 CMake 스크립트에서 이러한 대상에 수동으로 링크해야 합니다:
target_link_libraries(test_extensions PUBLIC test_messages)
참고: test_messages 대상의 메시지는 test_extensions 대상에 속하는 헤더 파일에서 사용되므로 test_extensions 에 링크하는 대상은 test_messages 대상을 전이 종속성으로 가져야 합니다. PUBLIC 연결 범위를 사용하여 protobuf 라이브러리 대상에 적절한 INTERFACE_INCLUDE_DIRECTORIES 및 INTERFACE_LINK_LIBRARIES 속성을 사용하는 것이 좋습니다.
예제
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)위의 예에서는 PROTO_FILES 옵션에 전달된 경로에 정의된 메시지 유형이 포함된 MyMessages 라는 라이브러리를 생성합니다. GENERATE_PACKAGE_SUBFOLDERS 옵션은 생성된 파일에 대한 폴더 구조를 생성합니다. 그리고 PROTO_INCLUDES 옵션은 지정된 디렉터리에서 종속성 또는 임포트를 찾도록 protoc에 지시합니다. MyApp 라는 실행 파일의 대상을 만들고 MyMessages 라이브러리에 링크합니다.
QML 확장 프로토뷰 예제
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)위의 QML 확장 예제에서는 첫 번째 qt_add_protobuf 호출을 통해 PROTO_FILES 옵션에 전달된 경로에 정의된 메시지 유형이 포함된 MyMessagesPlugin 이라는 QML 모듈을 생성합니다. QML 컨텍스트에서 프로토 메시지 유형을 등록할 수 있는 QML 옵션을 사용합니다. 등록된 유형은 QML_URI 에서 설정한 경로를 가져와 QML 에서 사용할 수 있습니다. 두 번째 qt_add_protobuf 호출을 통해 자동 생성된 코드를 기존 MyApp QML 모듈에 추가합니다. 이 경우 QML_URI 은 필요하지 않습니다. 마지막으로 그래픽 부분에 대한 QML 모듈이 있는 MyApp 이라는 실행 파일의 대상을 만들고 my.messages.module.uri 가져오기를 통해 MyMessagesPlugin 을 main.qml 파일에 로드합니다.
독립형 Qt Protobuf 라이브러리 설치
qt_add_protobuf 명령은 추가 설치를 위한 아티팩트 목록도 생성합니다. 다음과 같이 OUTPUT_HEADERS 및 OUTPUT_TARGETS 인수를 지정하여 이러한 아티팩트를 읽을 수 있습니다:
qt_add_protobuf(MyProtoLib
PROTO_FILES
mylib.proto
OUTPUT_HEADERS
public_headers
OUTPUT_TARGETS
generated_targets
)이 명령은 qt_add_protobuf 명령에 의해 생성된 헤더 파일 및 대상 목록을 public_headers 및 generated_targets 변수에 각각 저장합니다.
표준 CMake install 명령을 사용하여 아티팩트를 설치하고 라이브러리에 사용할 config 파일을 생성합니다:
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)그런 다음 패키지 구성 파일에 생성된 MyProtoLibTargets 구성을 사용합니다. 패키지 생성 프로세스에 대한 자세한 내용은 CMake 공식 문서에서 확인할 수 있습니다.
설치 후 라이브러리는 독립형 CMake 패키지로 사용할 수 있습니다:
find_package(Qt6 COMPONENTS Protobuf) find_package(MyProtoLib CONFIG) add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE MyProtoLib::MyProtoLib Qt6::Protobuf)
참고: qt_add_protobuf는 암시적으로 추가하지 않습니다. Qt Protobuf 모듈을 전이 종속성으로 추가하지 않으며, MyProtoLib 대상이나 MyProtoLib CMake 패키지에 대해서도 마찬가지입니다. 따라서 Qt Protobuf 모듈 조회와 MyApp 에서 Qt6::Protobuf 로의 명시적 링크가 필수입니다.
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.