0

我的工作空间中有一个静态库。其中有 Apple.h 和 .m 文件 在 .h 文件中我定义了两个@interface Apple:NSObject 和@interface GreenApple:NSObject

在同一个工作空间中,我有另一个引用这个静态库的 iOS 应用程序项目。在此应用程序中,当我继承 GreenApple 时,设备和模拟器构建都会出现“未定义符号”错误。但是,如果我从 Apple 继承,则没有错误。

跨项目导入的 .h 和继承的类必须相同还是我的 GreenApple 继承应该在 Apple.h 文件下工作?

编辑

为了测试理论,我重命名了文件以匹配错误类,但仍然是相同的错误。下面从文件 CMSGMealMenuItem.h 中给出了实际的实现。

@interface CMSGMealMenu : NSObject

@property (nonatomic, readonly) CMSGMealType mealType;
@property (nonatomic, readonly) NSDate *orderStartTime;
@property (nonatomic, readonly) NSDate *orderEndTime;
@property (nonatomic, readonly) NSArray *items;

@end

@interface CMSGMealMenuItem : NSObject

@property (nonatomic, readonly) NSString *itemId;
@property (nonatomic, readonly) NSString *itemDescription;
@property (nonatomic, readonly) NSString *itemSummary;
@property (nonatomic, readonly) NSNumber *itemPrice;

@end

CMSGMealMenuItem 继承总是抛出未定义的符号错误,无论 .h 文件名是否匹配。但是,我无法发现这与 CMSGMalMenu 定义有何不同?如果从它继承,它不会引发任何错误。

编辑

将 CMSGMealMenuItem 引用为方法参数不会显示任何构建错误,只有当我继承时才会出现错误。

这有效

@interface MSMealMenuItem : CMSGMealMenu

@property (nonatomic, retain) NSNumber *quantity;
@property (nonatomic, assign) BOOL isAddedToCart;

+ (MSMealMenuItem *) createMSMealMenuItemFromCMSGMealMenuItem:(CMSGMealMenuItem *)CMSGMealMenuItem;

@end

如果我将父级更改为 CMSGMealMenuItem 会引发未定义的符号错误,如下所示,我为设备或模拟器构建。

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_CMSGMealMenuItem", referenced from:
      _OBJC_CLASS_$_MSMealMenuItem in MSMealMenuItem.o
  "_OBJC_METACLASS_$_CMSGMealMenuItem", referenced from:
      _OBJC_METACLASS_$_MSMealMenuItem in MSMealMenuItem.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
4

2 回答 2

0

您需要将您的应用程序与包含CMSGMealMenuItem.

请参阅:http ://www.xs-labs.com/en/archives/articles/xcode-static-libraries/

于 2013-09-03T20:54:05.033 回答
0

我的错。我只是用合适的属性和方法定义我的@interface,推迟实现。当 CMSGMealMenu @implementation 在文件创建时自动生成时,我错过了为我明确引入的@interface CMSGMealMenuItem 放置@implementation。

我认为只要定义并链接了 .h 就应该很好编译,因为这就是我们导入的内容。但在继承期间似乎并非如此。

谢谢。

于 2013-09-04T04:05:47.853 回答