gpt4 book ai didi

c++ - 无法编译 protoc 生成的 (C++) 类

转载 作者:行者123 更新时间:2023-12-03 07:01:04 29 4
gpt4 key购买 nike

我目前在编译 protobuf 生成的 C++ 代码时遇到了一些麻烦。protoc运行正常并且没有显示任何警告,但是当我尝试编译生成的 C++ 代码以便构建静态库时,g++ 向我显示以下消息:

CanInfo.pb.cc:107:5: error: ‘::protobuf_BusType_2eproto’ has not been declared 107 | ::protobuf_BusType_2eproto::AddDescriptors();



到目前为止,我已经能够收集到,这是我的 BusType 枚举的一些问题,它看起来像这样:
syntax = "proto3";

package MyPackage;

enum BusType {

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

}

这个枚举包含在一条名为 CanInfo 的消息中,它看起来像这样:
syntax = "proto3";

package MyPackage;

import "BusType.proto";

message CanInfo {

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

}

正如我之前提到的, protoc “正确”编译这些文件(没有错误)。
用于编译 protos 的版本是 协议(protocol) 3.6.0 .
这是 protoc 生成的 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_BusType_2eproto命名空间是上面的行。
用于编译 C++ 代码的编译器版本是 powerpc-linux-gnu-g++-6 (Ubuntu 6.4.0-17ubuntu1) 6.4.0 20180424 .
将 G++ 版本更改为版本 8 或 9 改变这种行为。

我多次尝试清理构建目录,并尝试切换到不同的 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 中显然存在错误。编译器,每次编译单个文件时,在同一目录中导入文件都会导致这种奇怪的行为。
一次编译多个文件时,protoc产生一个错误,指出枚举值已在另一个文件中定义并发出以下注释:

device_data/BusType.proto:15:5: Note that enum values use C++ scoping rules, meaning that enum values are siblings of their type, not children of it. Therefore, "ProprietaryBus" must be unique within "MyPackage", not just within "BusType".



谷歌搜索愈演愈烈,我遇到了这个旧的 Google Code post从 2012 年开始:

To protocol compiler "bar.proto" and "x/bar.proto" are two proto files
although they are pointed at the same physical file.
Using 'import "x/bar.proto"' is the right fix.



解决方法(或修复)只是添加相对于 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}
)

到目前为止,这已经解决了我的问题,如果出现任何新信息,我将编辑我的答案。
也许这对其他人有用。

关于c++ - 无法编译 protoc 生成的 (C++) 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59661570/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com