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

标签 c++ import protocol-buffers protoc

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

  • 使用protoc从3个.proto文件生成C++代码。
  • 将生成的代码和我自己的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代码段:
    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,但概念相同)
    生成文件指定;

  • parser.cc和所有生成的.cc文件作为源。
  • $ LIBS标志-fPIC -lprotobuf(请注意此处缺少-Lprotoc ,我在跟踪中进一步遇到错误。通常涉及 undefined symbol )
  • $ INCFLAGS`-I $(srcdir)/ com / company```。 (这是make文件要包含在编译中的目录)
  • $ VPATH $(srcdir)/com/company。 (这是要搜索的make文件的目录。)

  • 这将为每个.proto文件生成一个.o文件,为parser.cc生成一个.o文件。然后将它们组合成单个.so文件,该文件可以按我们的预期使用。
    如果遇到类似问题,请随时提问。

    关于c++ - 使用ProtocolBuffer时,是否可以为生成的C++代码指定输出导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63625696/

    相关文章:

    c++ - 使用不同的编译器时,我从 dynamic_cast 获得不同的结果

    c++ - C++中的字典/哈希表对象?

    java - 无法导入 org.apache.commons

    c++ - SFINAE enable_if 显式构造函数

    c++ - 如何在不使用 std::async 的情况下使用 std::future?

    python - Python import 是否将所有代码复制到文件中

    python - 为什么要删除文件末尾的导入?

    java - 生成 java 类时无法使用 maven protobuf-maven-plugin 插件解析 google protobuf 文件中的导入语句

    java - 格式化包含非 ASCII 字符串的 Protobuf 消息

    c++ - 无法生成 gRPC 服务类