无法编译protoc生成的(C+;+;)类 我目前在编译原BUFF生成C++代码方面遇到了一些麻烦。 PotoCo/Cuth>运行正常,没有显示任何警告,但是当我尝试编译生成的C++代码以便构建静态库时,G+显示了以下消息:

无法编译protoc生成的(C+;+;)类 我目前在编译原BUFF生成C++代码方面遇到了一些麻烦。 PotoCo/Cuth>运行正常,没有显示任何警告,但是当我尝试编译生成的C++代码以便构建静态库时,G+显示了以下消息:,c++,g++,protocol-buffers,protoc,C++,G++,Protocol Buffers,Protoc,CanInfo.pb.cc:107:5:错误:“::protobuf_BusType_2eproto”尚未声明 107 |:::protobuf_BusType_2proto::AddDescriptors() 到目前为止,我收集到的是我的BusType枚举的一些问题,它看起来像这样: syntax = "proto3"; package MyPackage; enum BusType { ProprietaryBus = 0; OpenBus = 1; Unkno

CanInfo.pb.cc:107:5:错误:“::protobuf_BusType_2eproto”尚未声明 107 |:::protobuf_BusType_2proto::AddDescriptors()

到目前为止,我收集到的是我的BusType枚举的一些问题,它看起来像这样:

syntax = "proto3";

package MyPackage;

enum BusType {

    ProprietaryBus = 0;
    OpenBus = 1;
    UnknownBus = 2;

}
syntax = "proto3";

package MyPackage;

import "BusType.proto";

message CanInfo {

    int32 interfaceId = 10;
    bool isConnected = 20;
    BusType busType = 30;

}
此枚举包含在一条名为CanInfo的消息中,该消息如下所示:

syntax = "proto3";

package MyPackage;

enum BusType {

    ProprietaryBus = 0;
    OpenBus = 1;
    UnknownBus = 2;

}
syntax = "proto3";

package MyPackage;

import "BusType.proto";

message CanInfo {

    int32 interfaceId = 10;
    bool isConnected = 20;
    BusType busType = 30;

}
正如我前面提到的,
protoc
正确地(无错误地)编译这些文件。 用于编译protos的版本是protoc 3.6.0。 这是由代码> PrtoCu/Cube >生成的C++代码的一部分:

::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
      descriptor, 248);
::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
    "data_containers/device_data/CanInfo.proto", &protobuf_RegisterTypes);
::protobuf_BusType_2eproto::AddDescriptors();
//           ^ error occurs here
搜索代码时,唯一提到的
protobuf\u BusType\u 2eproto
名称空间是上面的一行。 编译C++代码的编译器版本是:<代码> PotoPC-LIUX-GNU-G++- 6(Ubuntu4.4.017Ubuntu1).4.4.0 20180424 。 更改用于版本8或9的G++版本不会改变此行为

我曾多次尝试清理构建目录,并尝试切换到其他protobuf版本(3.4.0),但这也导致了许多编译器错误,主要原因是
protoc
版本太旧

单独构建每个文件也不会改变行为

是什么导致了这种行为?到目前为止,我还没有遇到使用Protobuf的问题。 以前有没有人经历过这种情况,并且知道一个简单的窍门


编辑 这可能是我调用protoc的方式造成的吗

###
# Re-compile protos
###
set(BUILD_PROTOS True)
set(PROTOBUF_COMPILER protoc)
if (BUILD_PROTOS)
    function(BUILD_PROTOS)
        foreach(PROTO ${PROTOS})
            message("Compiling ${PROTO}...")
            execute_process(
                COMMAND ${PROTOBUF_COMPILER} ${PROTO_DIRS} "--cpp_out=${CMAKE_CURRENT_BINARY_DIR}" ${PROTO}
                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
            )
        endforeach()
    endfunction()

    ###
    # Compile all protos
    ###
    BUILD_PROTOS()
endif()

看来我已经解决了这个问题。 显然,
protoc
编译器中存在一个bug,每次编译单个文件时,导入同一目录中的文件会导致这种奇怪的行为。 一次编译多个文件时,
protoc
生成一个错误,指出枚举值已在另一个文件中定义,并发出以下注意事项:

Deice IsDATA/BuStupe。PROTO:15:5:注意枚举值使用C++范围规则,意味着枚举值是它们的类型的兄弟姐妹,而不是它的子节点。因此,“ProprietaryBus”在“MyPackage”中必须是唯一的,而不仅仅是在“BusType”中

谷歌搜索愈演愈烈,我遇到了2012年的一个老问题:

协议编译器“bar.proto”和“x/bar.proto”有两个proto文件
尽管它们指向同一个物理文件。
使用“import”x/bar.proto是正确的修复方法

解决方法(或修复)只是添加相对于
protoc
工作目录的整个路径

import "data_containers/device_data/BusType.proto";
在CMake中,现在看起来如下所示

message("Compiling protos...")
execute_process(
  COMMAND ${PROTOBUF_COMPILER}
  ${PROTO_DIRS} "--cpp_out=${CMAKE_CURRENT_BINARY_DIR}" ${PROTOS}
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
到目前为止,这已经解决了我的问题,如果出现任何新信息,我将编辑我的答案。
也许这对其他人有用

我认为
protobuf\u BusType\u 2eproto
名称空间应该用在
BusType.pb.h
中,它应该包含在
CanInfo.pb.h
中。您确定没有关于缺少包含的编译错误吗?除了上面发布的错误之外,没有其他错误。BusType.pb.h中使用的名称空间是
protobuf\u数据\u 5f容器\u 2f设备\u 5fdata\u 2fBusType\u 2proto