Nei*_*jee 1 cmake protocol-buffers
我对 CMAKE 还很陌生,但我正在使用find_package(Protobuf Requried)编译 .proto 文件作为构建的一部分,并且我在导入工作时遇到了麻烦,我真的很困惑。
我在同一个目录中有 2 个 .proto 文件,名为“A.proto”和“B.proto”的“protobuf”
没有导入,它们编译得很好。
如果我更改 A.proto 以导入 B:
syntax = "proto3";
import "B.proto";
message MyMessage
{}
Run Code Online (Sandbox Code Playgroud)
使用正确设置变量的 CMakeLists.txt 文件Protobuf_IMPORT_DIRS(我认为):
find_package(Protobuf REQUIRED)
set(Protobuf_IMPORT_DIRS ${Protobuf_IMPORT_DIRS} ${CMAKE_SOURCE_DIR}/protobuf)
...
protobuf_generate(TARGET ${MY_PROJECT_NAME})
Run Code Online (Sandbox Code Playgroud)
我在构建时得到了这个:
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.
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激,因为我觉得我正在服用疯狂的药丸!:)
所以我找到了答案,尽管需要一些技巧。基本上我只是阅读了所有与 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}")
Run Code Online (Sandbox Code Playgroud)
我希望这能避免将来有人头痛!
| 归档时间: |
|
| 查看次数: |
1969 次 |
| 最近记录: |