You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过CMake将Protobuf文件转为C++并使输出文件与原文件同目录?

解决CMake生成Protobuf C++文件到指定目录的问题

你的问题出在set_target_properties的RUNTIME_OUTPUT_DIRECTORY属性仅对可执行目标生效,自定义目标不支持该属性。要将Protobuf生成的C++文件放到与.proto文件相同的目录,有两种可行方案:

方案一:使用CMake 3.15+原生参数(推荐)

CMake 3.15及以上版本的protobuf_generate_cpp支持OUTPUT_DIR参数,可直接指定输出目录:

find_package(Protobuf REQUIRED)

file(GLOB PROTO_FILES *.proto)

# 指定输出目录为当前源文件目录
protobuf_generate_cpp(CPP_SOURCE_FILES PROTO_HEADERS ${PROTO_FILES}
    OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
add_custom_target(PROTO_TO_CPP ALL DEPENDS ${CPP_SOURCE_FILES})

方案二:手动调用protoc命令(兼容旧版本CMake)

若你的CMake版本低于3.15,可通过自定义命令直接调用protoc工具,完全控制输出路径:

find_package(Protobuf REQUIRED)

file(GLOB PROTO_FILES *.proto)

# 定义生成文件的输出目录(与proto文件同目录)
set(GENERATED_DIR ${CMAKE_CURRENT_SOURCE_DIR})

foreach(PROTO_FILE ${PROTO_FILES})
    # 获取proto文件名(不含后缀)
    get_filename_component(PROTO_NAME ${PROTO_FILE} NAME_WE)
    # 定义生成的cpp和h文件路径
    set(GENERATED_CPP ${GENERATED_DIR}/${PROTO_NAME}.pb.cc)
    set(GENERATED_H ${GENERATED_DIR}/${PROTO_NAME}.pb.h)

    # 添加自定义生成命令
    add_custom_command(
        OUTPUT ${GENERATED_CPP} ${GENERATED_H}
        COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
        ARGS --cpp_out=${GENERATED_DIR} -I${CMAKE_CURRENT_SOURCE_DIR} ${PROTO_FILE}
        DEPENDS ${PROTO_FILE}
        COMMENT "Generating C++ files from ${PROTO_FILE}"
    )

    # 将生成文件添加到列表中
    list(APPEND CPP_SOURCE_FILES ${GENERATED_CPP})
    list(APPEND PROTO_HEADERS ${GENERATED_H})
endforeach()

add_custom_target(PROTO_TO_CPP ALL DEPENDS ${CPP_SOURCE_FILES} ${PROTO_HEADERS})

注意事项

直接将生成文件放到源码目录会污染源码树,建议在源码目录下创建子文件夹(比如generated)存放生成文件,避免版本管理工具(如Git)误提交自动生成的文件。

内容的提问来源于stack exchange,提问作者Epsilon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:03:35