【发布时间】:2020-10-02 09:32:23
【问题描述】:
首先介绍一下上下文,我试图解耦一个包含 protobuf 定义以及使用 proto 的实体的 repo。我想创建一个仅包含 protobuf 定义和脚本的存储库,这些定义和脚本以不同语言导出生成的类,以供使用它们的其他项目导入。
在 c++ 中生成 protobuf 类实际上非常简单(几行 python 脚本),但之后就变得棘手了。您最终会得到一组杂乱无章的源文件。我想使用 CMake 收集所有文件并生成库。文件结构应如下所示:
/root
/proto-package-1
foo.pb.h
foo.pb.cc
/proto-package-2
/proto-package-3
bar.pb.h
bar.pb.cc
bazz.pb.h
bazz.pb.cc
我在 CMake 中有点菜鸟,但我读过在 CMakeLists.txt 文件中明确列出所有源文件是一种很好的做法。但我想让这个 c++ 库的生成完全自动化。这会是违反此规则的充分理由吗?哪些 CMake 命令可以帮助我?
cmake_minimum_required (VERSION 3.5)
project ("CMakeProject1")
set(TARGET_NAME CMakeProject1)
# Include sub-projects.
include_directories(${CMAKE_SOURCE_DIR})
add_library(${TARGET_NAME} STATIC
${CMAKE_SOURCE_DIR}/root/proto-package-1/foo.pb.h
${CMAKE_SOURCE_DIR}/root/proto-package-1/foo.pb.cc
//This is not going to cut it. Cannot add a proto and auto-generate.
)
【问题讨论】:
-
您知道protobuf_generate_cpp 函数,它使用protobuf 生成文件,不是吗?这个函数用生成的文件的路径分配输出变量,所以你只需要在
add_library调用中使用这个变量。 -
问题:CMake 模块是否喜欢、维护和使用?它是否编译 .proto 文件并将其分配给目标?如果是这样,我该如何指定要使用的 protoc 版本?
-
最后一次更新是十天前。有一种(遗憾的是未记录)模式,它检查目标的源并添加规则以将 protoc 生成的文件添加到目标。至于 protoc 版本,您可以尝试将所需版本传递给 find_package 命令。
-
我会尝试让它工作(这在 Windows 中是一个痛苦)。看起来它确实是为了将原型定义包含在同一个 repo 中,与我正在尝试的相反
标签: c++ cmake protocol-buffers