我有一个原型文件,用协议2语法编写。我正在使用协议3编译器编译这个原型文件。虽然它成功构建,但它在运行时显示以下错误。有人能帮我吗?
[libprotobuf FATAL google/protobuf/extension\u set.cc:102]x.y.z.a类型的多个扩展注册,字段号200。在抛出“google::protobuf::FatalException”what():type“x.y.z.a”字段号200的多个扩展注册的实例后调用terminate。
听起来您有一条消息x. y. z. a
,并且您有多个地方定义了一个id为200的扩展。
这样的话:
package x.y.z;
message a {
extensions 200 to 255;
}
extend a {
optional int32 foo = 200;
}
extend a {
optional int32 bar = 200;
}
因此,请检查这些重复的扩展名,它们可以在多个文件中定义。
该错误表明,不知何故,您的程序有两个此扩展的定义副本。这可能不是protoc的错,而是程序构建方式中的一些错误。
这是我的理论:你的proto文件已经被分别编译并链接到两个不同的组件/库中,然后它们都被加载到同一个程序中。其中一个组件是你的,另一个是共享相同协议的其他人的。另一个组件之前已经在使用Pro buf 3.5.1,但你的使用2.3.0。这意味着你的程序中实际上有两个libPro buf的副本。因此,扩展的两个副本是使用不同的libpro buf副本加载的,因此没有错误。但是现在您已经将您的组件切换到使用Pro buf 3.5.1,因此现在只加载了一个libPro buf副本,并且两个proto文件副本都被加载到那个libpro buf副本中。所以现在,你得到了一个错误。
要解决这个问题,您需要确保您的程序只包含每个proto文件的一个编译副本。如果两个组件需要共享一个协议,那么需要将该协议分解为一个单独的组件来共享。
编译器 编译器将用一种语言编写的代码转换为另一种语言,而无需更改程序的含义。还期望编译器应该使目标代码高效且在时间和空间方面得到优化。 编译器设计原理提供了翻译和优化过程的深入视图。编译器设计涵盖了基本的转换机制以及错误检测与恢复。它包括词法,语法和语义分析作为前端,以及代码生成和优化作为后端。 为什么要学习编译器设计? 计算机是软件和硬件的平衡组合。硬件只是机械设备的一部分,其功能由兼容的软件控
词法分析器 语法分析器 语义分析及中间代码生成 代码优化 代码生成
问题内容: 我正在尝试更好地理解它们之间的区别。我在网上找到了很多解释,但是它们倾向于抽象的差异,而不是实际的含义。 我的大部分编程经验都来自CPython(动态的,解释的)和Java(静态的,编译的)。但是,我知道还有其他种类的解释和编译语言。除了可以从以编译语言编写的程序中分发可执行文件这一事实之外,每种类型是否有优点/缺点?通常,我听到人们争辩说解释语言可以交互使用,但是我相信编译语言也可以
使用命令行编译器 注解 这一节并不适用于 solcjs solc 是 Solidity 源码库的构建目标之一,它是 Solidity 的命令行编译器。你可使用 solc --help 命令来查看它的所有选项的解释。该编译器可以生成各种输出,范围从简单的二进制文件、汇编文件到用于估计“gas”使用情况的抽象语法树(解析树)。如果你只想编译一个文件,你可以运行 solc --bin sourceFil
注:内容翻译自官网文档 Compiler Invocation 当使用--java_out= 命令行标记时,protocol buffer编译器生成java输出。--java_out= 选项的参数是想编译器写java输出的目录。编译器为每个.proto文件输入创建一个单一的.java文件.这个文件包含一个单一的outer class定义,包含一些内嵌类和静态字段,基于.proto文件中的定义。 o