【问题标题】:Apple Mach-O linker error: Undefined symbols for architecture armv7 Google ProtobufApple Mach-O 链接器错误:架构 armv7 Google Protobuf 的未定义符号
【发布时间】:2014-07-19 07:34:16
【问题描述】:

我一直在从事一个包含两个部分的项目:

  1. 一个 Cocoa Touch 静态库 (.framework)
  2. 一个使用我的(.framework)静态库的演示应用程序

我了解到任何添加到我的 .framework 的 .framework(即 opencv2.framework)也必须添加到我的演示应用程序中。我还了解到,Build Settings for Architectures 必须相同,并且必须设置 Build Settings Search Paths。

很高兴,我已经在我的演示应用程序中构建和使用我的 .framework 已经有一段时间了。最近,我在我的 .framework 中添加了 Google Protocol Buffers。

  1. 我的 .framework 正在编译,并且在 .framework 中看起来一切正常。
  2. 当然,我的 Demo 应用程序不是很开心。

所以现在我已将 libprotobuf-lite.a 添加到我的演示应用程序中,并在 Header Search Paths 中添加了 Header 文件的路径。

这应该可以解决问题。但是,相反,我收到以下错误,到目前为止还没有找到答案。这是错误日志:

Undefined symbols for architecture armv7:
  "vtable for google_public::protobuf::Message", referenced from:
      google_public::protobuf::Message::Message() in Test-Remote-iOS-Aggregate(ftype.pb.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "typeinfo for google_public::protobuf::Message", referenced from:
      typeinfo for message::FtypeMessage in Test-Remote-iOS-Aggregate(ftype.pb.o)
      message::FtypeMessage const* google_public::protobuf::internal::dynamic_cast_if_available<message::FtypeMessage const*, google_public::protobuf::Message const*>(google_public::protobuf::Message const*) in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::Message::GetTypeName() const", referenced from:
      vtable for message::FtypeMessage in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::Message::InitializationErrorString() const", referenced from:
      vtable for message::FtypeMessage in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::Message::SpaceUsed() const", referenced from:
      vtable for message::FtypeMessage in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::internal::ReflectionOps::Merge(google_public::protobuf::Message const&, google_public::protobuf::Message*)", referenced from:
      message::FtypeMessage::MergeFrom(google_public::protobuf::Message const&) in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::internal::WireFormat::VerifyUTF8StringFallback(char const*, int, google_public::protobuf::internal::WireFormat::Operation)", referenced from:
      google_public::protobuf::internal::WireFormat::VerifyUTF8String(char const*, int, google_public::protobuf::internal::WireFormat::Operation) in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "_OBJC_CLASS_$_CVImageConverter", referenced from:
      objc-class-ref in Test-Remote-iOS-Aggregate(IDMessageCommand.o)
  "google_public::protobuf::UnknownFieldSet::ClearFallback()", referenced from:
      google_public::protobuf::UnknownFieldSet::Clear() in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::Message::DiscardUnknownFields()", referenced from:
      vtable for message::FtypeMessage in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(google_public::protobuf::UnknownFieldSet const&)", referenced from:
      message::FtypeMessage::ByteSize() const in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::internal::WireFormat::SerializeUnknownFields(google_public::protobuf::UnknownFieldSet const&, google_public::protobuf::io::CodedOutputStream*)", referenced from:
      message::FtypeMessage::SerializeWithCachedSizes(google_public::protobuf::io::CodedOutputStream*) const in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::MessageFactory::InternalRegisterGeneratedFile(char const*, void (*)(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&))", referenced from:
      message::protobuf_AddDesc_ftype_2eproto() in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::internal::WireFormat::SkipField(google_public::protobuf::io::CodedInputStream*, unsigned int, google_public::protobuf::UnknownFieldSet*)", referenced from:
      message::FtypeMessage::MergePartialFromCodedStream(google_public::protobuf::io::CodedInputStream*) in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::UnknownFieldSet::MergeFrom(google_public::protobuf::UnknownFieldSet const&)", referenced from:
      message::FtypeMessage::MergeFrom(message::FtypeMessage const&) in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::internal::GeneratedMessageReflection::GeneratedMessageReflection(google_public::protobuf::Descriptor const*, google_public::protobuf::Message const*, int const*, int, int, int, google_public::protobuf::DescriptorPool const*, google_public::protobuf::MessageFactory*, int)", referenced from:
      message::protobuf_AssignDesc_ftype_2eproto() in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::Message::~Message()", referenced from:
      message::FtypeMessage::FtypeMessage() in Test-Remote-iOS-Aggregate(ftype.pb.o)
      message::FtypeMessage::~FtypeMessage() in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::UnknownFieldSet::UnknownFieldSet()", referenced from:
      message::FtypeMessage::FtypeMessage() in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::Message::CheckTypeAndMergeFrom(google_public::protobuf::MessageLite const&)", referenced from:
      vtable for message::FtypeMessage in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::DescriptorPool::generated_pool()", referenced from:
      message::protobuf_AssignDesc_ftype_2eproto() in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::DescriptorPool::InternalAddGeneratedFile(void const*, int)", referenced from:
      message::protobuf_AddDesc_ftype_2eproto() in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::Message::SerializeToOstream(std::__1::basic_ostream<char, std::__1::char_traits<char> >*) const", referenced from:
      message::TestMessaging::ftypeMessage(void const*, unsigned long) in Test-Remote-iOS-Aggregate(TestMessaging.o)
  "google_public::protobuf::MessageFactory::InternalRegisterGeneratedMessage(google_public::protobuf::Descriptor const*, google_public::protobuf::Message const*)", referenced from:
      message::(anonymous namespace)::protobuf_RegisterTypes(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(google_public::protobuf::UnknownFieldSet const&, unsigned char*)", referenced from:
      message::FtypeMessage::SerializeWithCachedSizesToArray(unsigned char*) const in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::DescriptorPool::FindFileByName(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const", referenced from:
      message::protobuf_AssignDesc_ftype_2eproto() in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::MessageFactory::generated_factory()", referenced from:
      message::protobuf_AssignDesc_ftype_2eproto() in Test-Remote-iOS-Aggregate(ftype.pb.o)
  "google_public::protobuf::UnknownFieldSet::~UnknownFieldSet()", referenced from:
      message::FtypeMessage::FtypeMessage() in Test-Remote-iOS-Aggregate(ftype.pb.o)
      message::FtypeMessage::~FtypeMessage() in Test-Remote-iOS-Aggregate(ftype.pb.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

关于这里可能出现的问题有什么想法吗?

谢谢。

【问题讨论】:

  • 如果没有一些额外的信息,很难知道这里到底发生了什么。您是否尝试在设备上运行?如果是这样,哪个设备?还是您要存档? Xcode 可以做的一件事是在调试时仅构建当前设备的可执行文件,如果您的主应用程序关闭了该选项(并尝试构建所有内容)但您的某些库启用了它(并且仅构建用于当前架构)。
  • @StevenFisher - 我正在为设备构建。我们的应用程序不会为模拟器构建。 Build Active Architectures Only 设置为 NO。有效架构是 i386 armv7。这些是 .framework 和 Demo 应用程序的设置。我想知道是否需要构建 libprotobuf-lite.a 以支持 armv7。
  • 好的。你插入了什么设备?和产品->运行或产品->存档?
  • @StevenFisher - 我使用的是 iPhone 5s 和 Product->Run。对不起。

标签: c++ objective-c xcode frameworks protocol-buffers


【解决方案1】:

链接器似乎没有在您的 .framework 上运行,并且 .proto 文件是为完整的 libprotobuf 而不是 libprotobuf-lite 而构建的。

尝试将胖 libprotobuf.a 添加到应用的框架文件夹中,看看它是否找到符号。

附带说明一下,您还没有提到另一个错误: "_OBJC_CLASS_$_CVImageConverter", referenced from: objc-class-ref in Test-Remote-iOS-Aggregate(IDMessageCommand.o)

不知道如何在没有看到您的代码的情况下修复该问题。

【讨论】:

  • 我在尝试使用 protbuf 构建框架之前也遇到过这个问题。这么好的库,但可能相当复杂。
  • 成功了!我将 libprotobuf-lite.a 换成了 libprotobuf.a,剩下的唯一错误就是你提到的那个。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 2012-04-13
  • 2013-09-11
相关资源
最近更新 更多