我们正在尝试用 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/