Apple Mach-O链接器错误:架构armv7 Google Protobuf的未定义符号

时间:2014-05-29 17:31:21

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

我一直致力于一个包含两个部分的项目:

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

    我已经了解到,添加到我的.framework(即opencv2.framework)的任何.framework也必须添加到我的Demo应用程序中。我还了解到体系结构的构建设置必须相同,并且必须设置构建设置搜索路径

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

    1. 我的.framework正在编译,并且在.framework中看起来都很好。
    2. 当然,我的Demo应用程序并不是很开心。
    3. 所以现在我已经将libprotobuf-lite.a添加到我的Demo应用程序中,并在标题搜索路径中添加了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)
      

      关于这可能是什么问题的任何想法?

      谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

作为旁注,你还有另一个错误,你没有提到: "_OBJC_CLASS_$_CVImageConverter", referenced from: objc-class-ref in Test-Remote-iOS-Aggregate(IDMessageCommand.o)

如果没有看到您的代码,就不确定如何解决这个问题。