【问题标题】:Is there a way to specify output imports for generated C++ code when using ProtocolBuffers?使用 ProtocolBuffers 时,有没有办法为生成的 C++ 代码指定输出导入?
【发布时间】:2020-12-16 21:50:57
【问题描述】:

我正在尝试使用 .proto 文件将 C++ 代码编译为单个二进制文件。我目前的流程有 2 个步骤;

  1. 使用 protoc 从 3 个 .proto 文件生成 C++ 代码。
  2. 将生成的代码和我自己的 C++ 代码编译成一个 .o 文件。

但是,当我尝试在步骤 2 中编译时,生成的代码指定输出为“com/company/B.pb.h”,编译器无法找到该文件,因为该文件位于同一目录中。

我不想手动更改生成的代码导入,因为我觉得应该由 protoc 来完成,并且我们还将这些 proto 文件用于其他项目(包括使用相同的 .proto 文件生成 java 代码,这是可行的) .有没有办法在不更改原型导入的情况下指定生成代码的导入?

编辑: 一次生成多个文件时,这是 protoc 的问题吗?我应该使用不同的命令吗?

我知道 java 有一些选项,例如指定包或类名,但我找不到 C++ 的类似选项。

option java_multiple_files = true;
option java_package = "com.company.B";
option java_outer_classname = "B";

非常感谢任何帮助。更多详情如下。

目录结构:

.
├── com
│   └── company # generated code
│       ├── A.pb.cc
│       ├── A.pb.h
│       ├── B.pb.cc
│       ├── B.pb.h
│       ├── C.pb.cc
│       └── C.pb.h
├── Parser.cc
├── Parser.h
└── proto
    └── com
        └── company
            ├── A.proto
            ├── B.proto
            └── C.proto

Protoc 命令:(从 . 运行)

protoc --cpp_out=. --proto_path=proto/ com/company/A.proto com/company/B.proto com/company/C.proto

A.proto sn-p:

syntax = "proto3";
option optimize_for = SPEED;

package com.company;

import "com/company/B.proto"; # specified as full path re Google's documentation

...

解析器.cc:

#include "parser.h"
...

解析器.h:

#include "com/company/A.pb.h"
#include "com/company/B.pb.h"
#include "com/company/C.pb.h"
...

G++ 指令:

g++ -fPIC -Lprotoc -lprotobuf parser.cc -o parser.so

错误:

fatal error: com/company/B.pb.h: No such file or directory
 #include "com/company/B.pb.h"
          ^~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

【问题讨论】:

    标签: c++ import protocol-buffers protoc


    【解决方案1】:

    我从来没有找到一种方法来指定 C++ 生成代码的输出,但我找到了一种方法来正确编译代码,而无需做一些笨拙的变通办法,我认为这是我一开始就应该采用的方法。如下:

    第一步,生成的C++代码不变,生成路径包含,编译在同一目录下。

    第 2 步变成了一个 make 文件(我们使用的是 Ruby Make/Rake,但概念是一样的) makefile 指定;

    • parser.cc 和所有生成的 .cc 文件作为源。
    • $LIBS 标志 -fPIC -lprotobuf(注意这里缺少 -Lprotoc ,我在跟踪过程中遇到了错误。通常是关于未定义的符号)
    • $INCFLAGS `-I$(srcdir)/com/company ```。 (这是编译时要包含的 make 文件的目录)
    • $VPATH $(srcdir)/com/company。 (这是用于搜索 make 文件的目录。)

    这导致为每个 .proto 文件生成一个 .o 文件,并为 parser.cc 生成一个 .o 文件。然后将它们组合成一个 .so 文件,可以按照我们的意图使用。

    如果您遇到类似问题,请随时提出问题。

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 2021-07-22
      • 2010-09-07
      • 1970-01-01
      • 2010-12-29
      • 2011-06-06
      • 1970-01-01
      • 2015-05-26
      • 2020-11-24
      相关资源
      最近更新 更多