如何通过CMake设置protoc的--experimental_allow_proto3_optional参数?
在CMake中为protoc添加
--experimental_allow_proto3_optional参数 针对你的需求,有两种常见实现方式:
方法一:全局设置(所有proto文件生效)
直接在调用PROTOBUF_GENERATE_CPP前,设置PROTOBUF_PROTOC_FLAGS变量传入所需参数:
file(GLOB PROTO_FILES ${PROJECT_SOURCE_DIR}/*.proto ) # 给protoc添加实验性参数 set(PROTOBUF_PROTOC_FLAGS "--experimental_allow_proto3_optional") PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${PROTO_FILES})
这个方法会让所有通过PROTOBUF_GENERATE_CPP处理的proto文件都带上该参数,适合所有proto都需要启用可选字段的场景。
方法二:自定义生成命令(针对单个/部分proto文件)
如果需要更精细的控制(比如只给特定proto加参数),可以用add_custom_command手动生成代码,替代现成的PROTOBUF_GENERATE_CPP:
file(GLOB PROTO_FILES ${PROJECT_SOURCE_DIR}/*.proto ) # 确保已找到Protobuf工具链 find_package(Protobuf REQUIRED) foreach(PROTO_FILE ${PROTO_FILES}) # 获取不带后缀的proto文件名 get_filename_component(PROTO_NAME ${PROTO_FILE} NAME_WE) # 指定生成的源码和头文件路径 set(PROTO_SRC "${CMAKE_CURRENT_BINARY_DIR}/${PROTO_NAME}.pb.cc") set(PROTO_HDR "${CMAKE_CURRENT_BINARY_DIR}/${PROTO_NAME}.pb.h") add_custom_command( OUTPUT ${PROTO_SRC} ${PROTO_HDR} COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} ARGS --cpp_out=${CMAKE_CURRENT_BINARY_DIR} --experimental_allow_proto3_optional -I${PROJECT_SOURCE_DIR} # 指定proto文件的搜索根目录 ${PROTO_FILE} DEPENDS ${PROTO_FILE} COMMENT "Generating C++ code from ${PROTO_FILE}" ) # 收集所有生成的文件 list(APPEND PROTO_SRCS ${PROTO_SRC}) list(APPEND PROTO_HDRS ${PROTO_HDR}) endforeach() # 后续将生成的文件关联到你的目标(示例) # add_executable(your_target ${PROTO_SRCS} your_source.cpp) # target_link_libraries(your_target ${PROTOBUF_LIBRARIES})
这种方式灵活性更高,你可以针对不同proto文件设置不同参数,或调整生成路径等细节。
注:你的protoc版本为v3.14,--experimental_allow_proto3_optional在此版本属于实验性参数;v3.19及以后该参数被移除,proto3可选字段成为正式特性,当前版本按上述设置即可正常使用。
内容的提问来源于stack exchange,提问作者Felix F Xu
相关产品推荐
相关产品推荐

