当前位置: 首页 > 知识库问答 >
问题:

在使用ProtocolBuffers时,有没有办法为生成的C代码指定输出导入?

邓宜年
2023-03-14

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

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

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

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

编辑:当一次生成多个文件时,这是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
syntax = "proto3";
option optimize_for = SPEED;

package com.company;

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

...
#include "parser.h"
...
#include "com/company/A.pb.h"
#include "com/company/B.pb.h"
#include "com/company/C.pb.h"
...
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.

共有1个答案

卢景澄
2023-03-14

我从未找到为C生成的代码指定输出的方法,但我找到了一种无需执行繁琐的变通方法即可正确编译代码的方法,我认为这是我一开始就应该采取的方法。这里是:

步骤1,生成的C代码保持不变,它是使用path INCLUDE生成的,并在同一目录中编译。

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

  • 解析器。cc和所有生成的。cc文件作为源

这导致了。o正在为每个生成文件。proto文件和。o解析器的文件。复写的副本。然后将它们合并为一个。所以文件可以按我们的意图使用。

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

 类似资料:
  • 问题内容: 当然,在Java中。我正在编写程序并在Windows环境下运行它,但是我需要以Unix格式完成输出(.csv)。任何简单的解决方案?谢谢! 问题答案: 注意:如评论中所述,下面给出的方法在JDK 9+中是无效的。 使用James H.的答案中的方法。 “ Unix格式”是指使用“ \ n”作为行终止符而不是“ \ r \ n”吗?在创建PrintWriter之前,只需设置系统属性即可。

  • 我正在将C#脚本移植到Spark(Scala)中,我遇到了Scala中UUID生成与C#中GUID生成的问题。 有没有办法在 Java 中生成与 C# 中生成的 UUID 相同的 UUID? 我通过从字符串的MD5散列创建Guid来生成数据库的主键。最后,我希望在Java/Scala中生成与C#脚本中的UUIDs相匹配的UUIDs,这样数据库中使用C#实现进行散列的现有数据就不需要重新散列。 C#

  • 不久前,我有了一个关于“参数化”用户定义文本的想法,并且想知道在当前的C标准中是否有任何方法可以做到这一点。 基本上,这个想法是有一个用户定义的文本,其行为可以根据一些参数进行调整。作为一个简单的例子,我选择了一个“定点”字面值,它将浮点数转换为整数;该参数是小数位数的精度。 这只是一个练习,因为我不确定这在实际应用中是否有用。 我的第一个想法是这样的: 但是,它不会编译,因为类范围中不允许使用名

  • 我正在写一个捕食者-猎物模型,类似于NetLogo中的狼羊捕食模型。我有一套关于代理何时可以复制(每个时间步的给定概率)的规则。我有没有办法追踪模型中的总出生率?还是捕食率?人口增长率?我真的不知道我能写些什么。 编辑:我还不确定我是想要每滴答的出生率还是超过一定数量的滴答,最终可能两者都要。如果一个时间步大约是一天,我想计算出每个时间步的出生率,但也包括一年中的出生率(所以大约365个时间步)。

  • 假设我生成了一个具有多个属性的域对象。我想为defn类中的一个对象属性生成@jsonignore注释。

  • 我想使用activeMQ来调度带有cron表达式的消息,并且能够使用UTC时区来实现这一点,但问题是,消息应该基于用户时区进行调度,每个用户都有不同的时区。 有没有办法在activeMQ中为每条消息指定时区? 我试过这个