Тем не менее, это не масштабируемая структура.
Следующее изменение, которое я пытался Код> каталог и переместить файлы *.proto в этот каталог.
Проект больше не строит, и я не могу понять, как его исправить.
Я искал в Интернете решения, а также попытался спросить CHATGPT. CHATGPT ходил по кругу, и я нашел то, что казалось очень переменными решениями, поиск ограниченных ресурсов, которые я мог найти в Интернете. Для меня не было очевидно, какие из многих вариаций могут быть правильным способом, но это, скорее всего, потому, что я не эксперт с Cmake , поэтому не мог выяснить, как собрать различные части вместе . < /p>
Это то, что у меня сейчас есть: < /p>
Код: Выделить всё
protobuf-example/
proto/
CMakeLists.txt
message.proto
CMakeLists.txt
main.cpp
< /code>
[h4]proto/CMakeLists.txt
Я не совсем уверен, что из приведенного ниже требуется. У меня есть некоторое понимание того, что делает каждая из этих строк, но мое понимание не очень твердое. < /P>
Код: Выделить всё
set(PROTO_FILES message.proto)
set(GENERATED_PROTO_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
file(MAKE_DIRECTORY ${GENERATED_PROTO_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_FILES})
add_library(proto_files STATIC ${PROTO_SRCS})
target_include_directories(proto_files PUBLIC ${Protobuf_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(proto_files PUBLIC ${Protobuf_LIBRARIES})
set(PROTO_GEN_SRCS ${PROTO_SRCS} PARENT_SCOPE)
set(PROTO_GEN_HDRS ${PROTO_HDRS} PARENT_SCOPE)
set(PROTO_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE)
< /code>
[h4]message.proto
Код: Выделить всё
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
string email = 3;
}
< /code>
[h4]CMakeLists.txt
С другой стороны, я знаком с этими утверждениями, и я совершенно уверен, что знаю, что делает каждый из них.
Код: Выделить всё
cmake_minimum_required(VERSION 3.10)
project(ProtobufExample LANGUAGES CXX)
find_package(Protobuf REQUIRED)
add_subdirectory(proto)
add_executable(protobuf_example main.cpp ${PROTO_GEN_SRCS})
target_include_directories(protobuf_example PRIVATE ${Protobuf_INCLUDE_DIR})
target_link_libraries(protobuf_example PRIVATE ${proto_files})
< /code>
[h4]main.cpp
Насколько мне известно, это просто стандартный пример.
Код: Выделить всё
#include
#include
#include "message.pb.h"
void serializePerson(const std::string& filename) {
Person person;
person.set_name("John Doe");
person.set_age(30);
person.set_email("john.doe@example.com");
std::ofstream output(filename, std::ios::binary);
if (!person.SerializeToOstream(&output)) {
std::cerr
Подробнее здесь: [url]https://stackoverflow.com/questions/79423920/how-to-build-a-cmake-project-which-uses-protobuf[/url]