【问题标题】:PROTOBUF_GENERATE_CPP not generating src and header filesPROTOBUF_GENERATE_CPP 不生成 src 和头文件
【发布时间】:2020-04-21 15:14:44
【问题描述】:

我的 cmake 配置没有生成任何 protobuf src 和头文件。 我已经检查过是否可以找到 proto 文件。

Cmakelists.txt

cmake_minimum_required(VERSION 3.0.2)
..
include(FindProtobuf REQUIRED)
file(GLOB PROTO_DEF "${CMAKE_CURRENT_SOURCE_DIR}/protobuf/*/*.proto")

foreach(file ${PROTO_DEF})    
    if(EXISTS ${file})
        MESSAGE("YES")
    else()
        MESSAGE("NO")
    endif()
endforeach()
SET(PROTOBUF_GENERATE_CPP_APPEND_PATH PROTOBUF)
SET(PROTOBUF_PROTOC_EXECUTABLE protoc.exe)

..
PROTOBUF_GENERATE_CPP(PROTO_SRC PROTO_INCL ${PROTO_DEF})
..
add_library(${PROJECT_NAME} STATIC ${INCLUDES} ${INTERNAL_INCLUDES} ${SRC} ${PROTO_SRC} ${PROTO_INCL})
target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})

我检查了 FindProtobuf.cmake 并完成了一半:

foreach(FIL ${ARGN})
    get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
    get_filename_component(FIL_WE ${FIL} NAME_WE)

    list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")
    list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
    
    MESSAGE(1 ${CMAKE_CURRENT_BINARY_DIR})
    MESSAGE(2 ${_protobuf_include_path})
    MESSAGE(3 ${ABS_FIL})
    MESSAGE(4 ${PROTOBUF_PROTOC_EXECUTABLE})
    
    add_custom_command(
      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc"
             "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h"
      COMMAND  ${PROTOBUF_PROTOC_EXECUTABLE}
      ARGS --cpp_out  ${CMAKE_CURRENT_BINARY_DIR} ${_protobuf_include_path} ${ABS_FIL}
      DEPENDS ${ABS_FIL}
      COMMENT "Running C++ protocol buffer compiler on ${FIL}"
      VERBATIM )
      
  endforeach()

您可以看到我添加了 4 个消息命令,脚本到达了这一点并且变量显示了良好的值。 proto 文件确实对库有依赖性,因此应该执行命令!?

对这个问题有什么想法吗?

更新

将 add_custom_command 替换为

EXEC_PROGRAM(${PROTOBUF_PROTOC_EXECUTABLE} ARGS --cpp_out ${CMAKE_CURRENT_BINARY_DIR} ${_protobuf_include_path} ${ABS_FIL}

是否会生成源文件和头文件,我必须手动激活 custom_commmands 吗?

问候奥克

【问题讨论】:

    标签: cmake protocol-buffers


    【解决方案1】:

    add_custom_command 在编译期间被触发(对于我的项目)。 添加

    SET_SOURCE_FILES_PROPERTIES(${PROTO_SRC} ${PROTO_INCL} PROPERTIES GENERATED TRUE)
    

    给出将生成文件的 cmake 信息。

    【讨论】:

      【解决方案2】:

      如果您有外部 proto 文件夹,则可以选择:

      file(GLOB PROTOBUF_FILELIST ${PROTO_INCLUDE_DIR}/*.proto)
      foreach( proto_file ${PROTOBUF_FILELIST} )
         get_filename_component(proto_name ${proto_file} NAME_WE)
         get_filename_component(proto_path ${PROTO_INCLUDE_DIR} ABSOLUTE)
         set_source_files_properties("${proto_path}/${proto_name}.pb.cc"
                                     "${proto_path}/${proto_name}.pb.h"
                                     PROPERTIES GENERATED TRUE)
      endforeach()
      

      【讨论】:

      • 我不认为你可以指向一个完整的 cmake 文件,其中有多个 proto 文件并且一个导入另一个?
      【解决方案3】:

      只有当目标是库时才会出现这个问题(使用 add_library,add_executable 似乎没问题)。 PROTOBUF_GENERATE_CPP 将在构建库时推迟 protobuf 源和标头的生成。四处走走是定义一个自定义目标并将其作为依赖项添加到 lib 目标。例如

      add_custom_target(proto_dep DEPENDS ${PROTO_SRCS} ${PROTO_HDRS})
      add_library(${PROJECT_NAME} STATIC ${OTHER_SRCS})
      add_dependencies(${PROJECT_NAME} proto_dep)
      target_link_libraries(${PROJECT_NAME} PRIVATE gRPC::grpc++ gRPC::grpc++_reflection protobuf::libprotobuf)
      

      【讨论】:

      • 如何获得*.grpc.pb.cc files的列表?我只有要编译的*.pb.cpp 文件列表包含在变量`${PROTO_SRCS} 中。在您的示例中,您没有编译任何一个列表,不是吗?
      • 这行不通,不要在这上面浪费时间。我累了还是不能生成cpp
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 2014-11-10
      • 2020-06-13
      • 1970-01-01
      • 2019-03-03
      • 2018-12-06
      • 2019-02-24
      相关资源
      最近更新 更多