c++ - Protobuf 生成的 C++ 类无法针对 iOS 进行编译,错误为 "Only virtual member functions can be marked ' final'"

标签 c++ ios xcode protocol-buffers

我们正在尝试用 C++ 构建一个共享库,可以在我们的 Android 和 iOS 应用程序中使用。该库使用 protobuf 生成的 C++ 类,以便在 Android/iOS 上的 C++ 对象和 Java/Swift 对象之间进行转换。 C++ 代码在 Android 上编译得很好,但 Xcode 编译器在我们的 protobuf 生成的 C++ 类中专门抛出多个错误。此代码也可在 Windows、MacOS 和 Linux 上编译。

我已经尝试将 C++ 语言版本更改为 GNU++(我们使用的是 C++17)并尝试更改 Xcode 中的一些编译器设置,但同样的错误不断出现。我也尝试研究更改 protoc 生成 C++ 文件的方式,但我没有找到任何东西。

到目前为止,我只在 protobuf 生成的 C++ 头文件中遇到错误:

void SerializeWithCachedSizes(
      ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final;
  ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray(
      ::PROTOBUF_NAMESPACE_ID::uint8* target) const final;

第一行报错“Only virtual member functions can be marked 'final'”,第三行报错“Non-virtual member function marked 'final' hides virtual member function”。

此代码在我们的 protobuf 生成的类中重复多次,因此我们一遍又一遍地看到相同的两个错误。

我可以简单地编辑代码,但我想尽可能避免弄乱自动生成的代码。

最佳答案

我在 Linux 上遇到了同样的问题。 在我的例子中,是一些环境变量(特别是活跃的 conda 虚拟环境)触发了“SerializeWithCachedSizes”的生成。 如果没有 conda 环境变量,“SerializeWithCachedSizes”不会出现在代码中,也不会导致编译错误。 Conda 使用自己的协议(protocol)安装(与通过 apt 从源代码安装的版本号相同)。

关于c++ - Protobuf 生成的 C++ 类无法针对 iOS 进行编译,错误为 "Only virtual member functions can be marked ' final'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57275574/

相关文章:

C++重载运算符=以获得右手和左手重载

c++ - DirectX9 C++ - 在窗口最小化时加载纹理

c++ - 是否有一些类似于 boost program_options 但用于 *keyboard shortcut auto-gen help* 的 c++ 库/源代码?

ios - 删除过期的配置文件

objective-c - 从 MainMenu 获取特定菜单项

ios - -[NSDate dateFromString:]:无法识别的选择器发送错误

c++ - 使用枚举进行类型检查——如何正确确定范围

objective-c - iOS mapview - 添加注释时出现问题

ios - 尝试从 iOS 将文件上传到 OneDrive。我的要求有什么问题?

ios - iPad 横向启动图像逆时针旋转 90 度