使用ProtocolBuffer时,是否可以为生成的C ++代码指定输出导入?

问题描述

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

  1. 使用协议从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 --cpp_out=. --proto_path=proto/ com/company/A.proto com/company/B.proto com/company/C.proto

A.proto代码段:

Syntax = "proto3";
option optimize_for = SPEED;

package com.company;

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

...

Parser.cc:

#include "parser.h"
...

Parser.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 ++生成的代码指定输出,但是我找到了一种无需进行麻烦的变通方法即可正确编译代码的方法,我认为这是我一开始应该采取的方法。去吧:

第1步,生成的C ++代码保持不变,并使用路径include生成它,并将其编译在同一目录中。

第2步成为制作文件(我们使用的是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文件,该文件可以按我们的预期使用。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...