【问题标题】:Cmake 3.1 + "Protobuf_IMPORT_DIRS" importing another .proto errorCmake 3.1 +“Protobuf_IMPORT_DIRS”导入另一个.proto错误
【发布时间】:2020-08-21 15:09:08
【问题描述】:

我对 CMAKE 还是很陌生,但我正在使用 find_package(Protobuf Requried) 来编译我的 .proto 文件作为构建的一部分,我在导入工作时遇到了麻烦,而且我真的很好难住了。

我在同一个目录中有 2 个 .proto 文件,分别名为“A.proto”和“B.proto”的“protobuf”

没有导入,它们编译得很好。

如果我将 A.proto 更改为对 B 的导入:

syntax = "proto3";
import "B.proto";


message MyMessage
{}

使用正确设置 Protobuf_IMPORT_DIRS 变量的 CMakeLists.txt 文件(我认为):

find_package(Protobuf REQUIRED)
set(Protobuf_IMPORT_DIRS ${Protobuf_IMPORT_DIRS} ${CMAKE_SOURCE_DIR}/protobuf) 

...

protobuf_generate(TARGET ${MY_PROJECT_NAME})

我在构建时得到了这个:

  Running cpp protocol buffer compiler on protobuf/A.proto
  B.proto: File not found.
  protobuf/A.proto:3:1: Import "B.proto" was not found or had errors.

任何帮助将不胜感激,因为我觉得我正在服用疯狂的药丸! :)

【问题讨论】:

    标签: cmake protocol-buffers


    【解决方案1】:

    所以我找到了答案,尽管它需要一些黑客攻击。基本上我只是阅读了所有与 Protobuf 相关的 CMAKE 文件,直到我弄明白为止。那里可能有更好的文档,但我找不到。

    短篇小说:

    如果您调用PROTOBUF_GENERATE_CPP,它尊重设置Protobuf_IMPORT_DIRS 变量。

    但是,如果您像我一样直接为目标调用protobuf_generate,则该变量将被忽略。

    答案是调用protobuf_generate,参数为IMPORT_DIRS,如:

    protobuf_generate(TARGET ${MY_PROJECT_NAME} IMPORT_DIRS protobuf)

    IMPORT_DIRS 是一个多参数,你可以提供多个。

    以下是相关代码:

    function(protobuf_generate)
      include(CMakeParseArguments)
    
      set(_options APPEND_PATH)
      set(_singleargs LANGUAGE OUT_VAR EXPORT_MACRO PROTOC_OUT_DIR PLUGIN)
      if(COMMAND target_sources)
        list(APPEND _singleargs TARGET)
      endif()
      set(_multiargs PROTOS IMPORT_DIRS GENERATE_EXTENSIONS)
    
      cmake_parse_arguments(protobuf_generate "${_options}" "${_singleargs}" "${_multiargs}" "${ARGN}")
    
    

    我希望这会在将来避免一些人头疼!

    【讨论】:

      猜你喜欢
      • 2018-02-10
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多