我正在尝试使用静态库,并且在运行时未使用其中的类别。没有编译时错误,但是当我开始运行时,我收到标准的“无法识别的选择器发送到实例”消息,我的应用程序崩溃了。

许多解决方案说将 -ObjC -all_load 添加到应用程序目标中的“其他链接器标志”属性(许多其他人说,从 XCode 4 开始,不再需要它,这是我费心包含 XCode 版本的唯一原因)。我试过了,在构建过程中出现 115 个错误:
Undefined symbols for architecture i386: "_CLLocationCoordinate2DMake", referenced from: -[QMapElement init] in libQuickDialog.a(QMapElement.o) "_OBJC_CLASS_$_MKMapView", referenced from: objc-class-ref in libQuickDialog.a(QMapViewController.o) "_OBJC_CLASS_$_MKPinAnnotationView", referenced from: objc-class-ref in libQuickDialog.a(QMapViewController.o) "std::istream::gcount() const", referenced from: GT::AES::decode(std::istream&, std::ostream&, unsigned int&, bool) in GD(gtaes.o) GT::AES::encode(std::istream&, std::ostream&, unsigned int&, bool) in GD(gtaes.o) "std::string::find_first_of(char const*, unsigned long, unsigned long) const", referenced from: -[GDSetPasswordViewController checkPasswordStrength:] in GD(GDSetPasswordViewController.o) GD::EacpCReq::EacpCReq(std::string, std::string, GT::Dbb&) in GD(GDEacpCommands.o) GD::RawSocket::connect() in GD(GDRawSocket.o) "std::string::copy(char*, unsigned long, unsigned long) const", referenced from: GD::Socket::toString() const in GD(GDSocket.o)
(依此类推,这大约是 115 个中的 5 个或 6 个)。

无论我有这些链接器标志中的一个还是两者,我都会收到完全相同的错误集。

不确定这是否是罪魁祸首,或者只是巧合,但在更仔细地查看错误之后,似乎它们都来自我正在使用的两个 3rd 方库之一。一个作为已安装的 .framework,另一个作为常规静态库。也许我也需要对他们的构建做一些事情(如果可能的话)?
谢谢!

最佳答案

在我看来,错误消息指向了一些缺失的框架:

  • CoreLocation(_CLLocationCoordinate2DMake 符号);
  • MapKit(_OBJC_CLASS_$_MKPinAnnotationView 符号);
  • C++ 标准库。

  • 尝试将它们包含在您的目标中……特别是对于 C++ 标准库,您应该在 Xcode 中的“Apple LLVM Compiler x.y - Language”下检查特定的build设置。

    这不排除其他缺失框架的可能性,当然......

    关于objective-c - XCode 4.5、静态库和类别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13234487/

    10-13 04:04